【发布时间】:2017-03-22 21:31:00
【问题描述】:
我正在开发一个需要检测类的项目。我正在使用javassist,因为在我的情况下进行检测非常方便。
我遇到了一个问题,可以使用以下代码 sn-p 来描述:
假设第 1 类:
public class Class1 {
Class2 class2;
}
第二类:
public class Class2 {
//Code
}
还有一个从定义的类中获取CtClasses 并进行一些代码转换的函数。
public void testFunction() throws NotFoundException {
ClassPool classPlool;
classPlool = ClassPool.getDefault();
CtClass ctCls1 = classPlool.getAndRename("Class1", "Class1_V1");
// instrument and load ctCls1 etc.
CtClass ctCls2 = classPlool.getAndRename("Class2", "Class2_V1");
// instrument and load ctCls1 etc.
}
因为,我正在重命名类,所以 Class1 中的字段 Class2 class2 的类型为 class Class2,但该类被重命名为 Class2_V1。我也想将字段类型从 LClass2 重命名为 LClass2_V1。
ctCls1 是:javassist.CtClassType@3b9a45b3[changed public class Class1_V1 fields=Class1_V1.class2:LClass2;, constructors=javassist.CtConstructor@568db2f2[public Class1_V1 ()V], methods=]
PS:我必须使用不同的仪器加载两个版本的类,所以在我的情况下这是最好的方法。此外,我已经搜索过该问题,但没有解决方案,例如this link 描述重命名字段,但不输入。
【问题讨论】:
-
请注意,我总是附加“_V1”或“_V2”。所以,如果你帮我重命名“LClass1_V1”或“LClass1_V2”就足够了。
-
能不能不完全删除字段,然后用新名称和新类型添加一个新字段?
-
我可以,但是删除然后添加和使用'setType()'没有区别
标签: java classloader instrumentation javassist