javassist:重命名 类 和字段类型
javassist: Rename classes and Fields types
我正在从事一个需要 classes 检测的项目。我正在使用 javassist
,因为在我的情况下进行检测非常方便。
我遇到了一个问题,可以使用以下代码片段进行描述:
假设Class1:
public class Class1 {
Class2 class2;
}
和Class 2:
public class Class2 {
//Code
}
还有一个函数,用于从定义的 classes 中获取 CtClass
es 并进行一些代码转换。
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.
}
因为,我正在重命名 classes,所以 Class1
中的字段 Class2 class2
是 class Class2
类型,但是 class 是重命名为 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:我必须使用不同的工具加载两个版本的 classes,所以这是我的最佳方式。而且,我已经搜索了这个问题,但是没有解决它的方法,就像this link描述的是重命名字段,而不是类型。
根据Javassist
documentation:
新的 class 可以定义为现有 class 的副本。下面的程序就是这样做的:
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("Point");
cc.setName("Pair");
该程序首先获取 class 点的 CtClass
对象。
然后它调用 setName()
为那个 CtClass
对象赋予一个新名称 Pair。
此调用后,class 定义中由该 CtClass
对象表示的所有 class 名称都从点更改为对。 class 定义的另一部分没有改变。
编辑:
为了重命名 class 中的字段类型,您可以导航 class 并通过 Javassist
类型获取它 CtField
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("Class1");
CtField cf = cc.getField("class2NameIntoClass1");
CtClass cc2 = cf.getType();
cc2.setName("Class2NewName");
我正在从事一个需要 classes 检测的项目。我正在使用 javassist
,因为在我的情况下进行检测非常方便。
我遇到了一个问题,可以使用以下代码片段进行描述:
假设Class1:
public class Class1 {
Class2 class2;
}
和Class 2:
public class Class2 {
//Code
}
还有一个函数,用于从定义的 classes 中获取 CtClass
es 并进行一些代码转换。
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.
}
因为,我正在重命名 classes,所以 Class1
中的字段 Class2 class2
是 class Class2
类型,但是 class 是重命名为 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:我必须使用不同的工具加载两个版本的 classes,所以这是我的最佳方式。而且,我已经搜索了这个问题,但是没有解决它的方法,就像this link描述的是重命名字段,而不是类型。
根据Javassist
documentation:
新的 class 可以定义为现有 class 的副本。下面的程序就是这样做的:
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("Point");
cc.setName("Pair");
该程序首先获取 class 点的 CtClass
对象。
然后它调用 setName()
为那个 CtClass
对象赋予一个新名称 Pair。
此调用后,class 定义中由该 CtClass
对象表示的所有 class 名称都从点更改为对。 class 定义的另一部分没有改变。
编辑:
为了重命名 class 中的字段类型,您可以导航 class 并通过 Javassist
类型获取它 CtField
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("Class1");
CtField cf = cc.getField("class2NameIntoClass1");
CtClass cc2 = cf.getType();
cc2.setName("Class2NewName");