javassist:重命名类和字段类型

标签 java classloader instrumentation javassist

我正在开发一个需要类检测的项目。我使用 javassist 因为在我的情况下进行检测非常方便。

我遇到了一个问题,可以使用以下代码片段进行描述:

假设 1 类:

public class Class1 {
    Class2 class2;
}

第 2 类:

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] ,方法=]

PS:我必须使用不同的工具加载两个版本的类,所以这对我来说是最好的方法。此外,我已经搜索过该问题,但没有解决方案,例如 this link描述重命名字段,但不重命名类型。

最佳答案

根据Javassist documentation :

新类可以定义为现有类的副本。下面的程序就是这样做的:

ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("Point");
cc.setName("Pair");

该程序首先获取Point类的CtClass对象。

然后它调用 setName() 为该 CtClass 对象指定一个新名称 Pair。

此调用之后,该 CtClass 对象表示的类定义中出现的所有类名都会从 Point 更改为 Pair。类定义的其他部分不变。

编辑: 为了重命名类中的字段类型,您可以导航该类并通过 Javassist 类型 CtField

获取它
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("Class1");
CtField cf = cc.getField("class2NameIntoClass1");
CtClass cc2 = cf.getType();
cc2.setName("Class2NewName");

关于javassist:重命名类和字段类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42963008/

相关文章:

java - 运行 Java 解释器以将控制台输出作为字符串返回

java - 如何跟踪 View 行的 ArrayList 的动态索引

java 。替换所有以 : with space 结尾的单词

java - 是否可以创建指向内存中对象的 URL?

java - Weblogic类加载

java - 如何从 JAR 应用程序中动态加载类以在另一个 JAR 中使用?

Java Ant 生成器 - "Content is not allowed in prolog.".sh

java - 将 JPanel 暴露给外部 jar

java - 在我的项目包之外的类上使用asm(java字节码)类读取器?

java - 无法以编程方式触发点击事件