@@ -117,6 +117,28 @@ public class AnnotationDefaultAttribute extends AttributeInfo { | |||
} | |||
} | |||
@Override | |||
void renameClass(String oldname, String newname) { | |||
try { | |||
MemberValue defaultValue = getDefaultValue(); | |||
defaultValue.renameClass(oldname, newname); | |||
setDefaultValue(defaultValue); | |||
} catch (Exception e) { | |||
// ignore | |||
} | |||
} | |||
@Override | |||
void renameClass(Map<String, String> classnames) { | |||
try { | |||
MemberValue defaultValue = getDefaultValue(); | |||
defaultValue.renameClass(classnames); | |||
setDefaultValue(defaultValue); | |||
} catch (Exception e) { | |||
// ignore | |||
} | |||
} | |||
/** | |||
* Obtains the default value represented by this attribute. | |||
*/ |
@@ -254,7 +254,7 @@ public class AttributeInfo { | |||
/* The following two methods are used to implement | |||
* ClassFile.renameClass(). | |||
* Only CodeAttribute, LocalVariableAttribute, | |||
* AnnotationsAttribute, and SignatureAttribute | |||
* AnnotationDefaultAttribute, AnnotationsAttribute, and SignatureAttribute | |||
* override these methods. | |||
*/ | |||
void renameClass(String oldname, String newname) {} |
@@ -121,29 +121,29 @@ public class SignatureAttribute extends AttributeInfo { | |||
if (j < 0) | |||
break; | |||
StringBuilder nameBuf = new StringBuilder(); | |||
int k = j; | |||
char c; | |||
try { | |||
while ((c = desc.charAt(++k)) != ';') { | |||
nameBuf.append(c); | |||
if (c == '<') { | |||
while ((c = desc.charAt(++k)) != '>') | |||
nameBuf.append(c); | |||
nameBuf.append(c); | |||
} | |||
} | |||
int k = desc.indexOf(';', j); | |||
if (k < 0) | |||
break; | |||
int l = desc.indexOf('<', j); | |||
int classEndIndex; | |||
char classEndChar; | |||
if (l < 0 || k < l) { | |||
classEndIndex = k; | |||
classEndChar = ';'; | |||
} else { | |||
classEndIndex = l; | |||
classEndChar = '<'; | |||
} | |||
catch (IndexOutOfBoundsException e) { break; } | |||
i = k + 1; | |||
String name = nameBuf.toString(); | |||
i = classEndIndex + 1; | |||
String name = desc.substring(j + 1, classEndIndex); | |||
String name2 = map.get(name); | |||
if (name2 != null) { | |||
newdesc.append(desc.substring(head, j)); | |||
newdesc.append('L'); | |||
newdesc.append(name2); | |||
newdesc.append(c); | |||
newdesc.append(classEndChar); | |||
head = i; | |||
} | |||
} |
@@ -18,6 +18,7 @@ package javassist.bytecode.annotation; | |||
import java.io.IOException; | |||
import java.lang.reflect.Array; | |||
import java.lang.reflect.Method; | |||
import java.util.Map; | |||
import javassist.ClassPool; | |||
import javassist.bytecode.ConstPool; | |||
@@ -87,6 +88,30 @@ public class ArrayMemberValue extends MemberValue { | |||
return a.getClass(); | |||
} | |||
@Override | |||
public void renameClass(String oldname, String newname) { | |||
if (type != null) { | |||
type.renameClass(oldname, newname); | |||
} | |||
if (values != null) { | |||
for (MemberValue value : values) { | |||
value.renameClass(oldname, newname); | |||
} | |||
} | |||
} | |||
@Override | |||
public void renameClass(Map<String, String> classnames) { | |||
if (type != null) { | |||
type.renameClass(classnames); | |||
} | |||
if (values != null) { | |||
for (MemberValue value : values) { | |||
value.renameClass(classnames); | |||
} | |||
} | |||
} | |||
/** | |||
* Obtains the type of the elements. | |||
* |
@@ -18,6 +18,7 @@ package javassist.bytecode.annotation; | |||
import java.io.IOException; | |||
import java.lang.reflect.Method; | |||
import java.util.Map; | |||
import javassist.ClassPool; | |||
import javassist.bytecode.BadBytecode; | |||
@@ -95,6 +96,20 @@ public class ClassMemberValue extends MemberValue { | |||
return loadClass(cl, "java.lang.Class"); | |||
} | |||
@Override | |||
public void renameClass(String oldname, String newname) { | |||
String value = cp.getUtf8Info(valueIndex); | |||
String newValue = Descriptor.rename(value, oldname, newname); | |||
setValue(Descriptor.toClassName(newValue)); | |||
} | |||
@Override | |||
public void renameClass(Map<String, String> classnames) { | |||
String value = cp.getUtf8Info(valueIndex); | |||
String newValue = Descriptor.rename(value, classnames); | |||
setValue(Descriptor.toClassName(newValue)); | |||
} | |||
/** | |||
* Obtains the value of the member. | |||
* |
@@ -18,6 +18,7 @@ package javassist.bytecode.annotation; | |||
import java.io.IOException; | |||
import java.lang.reflect.Method; | |||
import java.util.Map; | |||
import javassist.ClassPool; | |||
import javassist.bytecode.ConstPool; | |||
@@ -76,6 +77,20 @@ public class EnumMemberValue extends MemberValue { | |||
return loadClass(cl, getType()); | |||
} | |||
@Override | |||
public void renameClass(String oldname, String newname) { | |||
String type = cp.getUtf8Info(typeIndex); | |||
String newType = Descriptor.rename(type, oldname, newname); | |||
setType(Descriptor.toClassName(newType)); | |||
} | |||
@Override | |||
public void renameClass(Map<String, String> classnames) { | |||
String type = cp.getUtf8Info(typeIndex); | |||
String newType = Descriptor.rename(type, classnames); | |||
setType(Descriptor.toClassName(newType)); | |||
} | |||
/** | |||
* Obtains the enum type name. | |||
* |
@@ -18,6 +18,7 @@ package javassist.bytecode.annotation; | |||
import java.io.IOException; | |||
import java.lang.reflect.Method; | |||
import java.util.Map; | |||
import javassist.ClassPool; | |||
import javassist.bytecode.ConstPool; | |||
@@ -74,6 +75,14 @@ public abstract class MemberValue { | |||
return classname; | |||
} | |||
/* The following two methods are used to implement | |||
* ClassFile.renameClass(). | |||
* Only ArrayMemberValue, ClassMemberValue, EnumMemberValue | |||
* override these methods. | |||
*/ | |||
public void renameClass(String oldname, String newname) {} | |||
public void renameClass(Map<String, String> classnames) {} | |||
/** | |||
* Accepts a visitor. | |||
*/ |