2017-03-22 63 views
1

我正在处理需要类的检测的项目。我使用javassist,因为在我的情况下做仪器非常方便。javassist:重命名类和字段类型

我面临一个问题,可以使用下面的代码段来描述:

假设第1类:

public class Class1 { 
    Class2 class2; 
} 

和2类:

public class Class2 { 
    //Code 
} 

而对于一个功能从定义的类中获取CtClass,并进行一些代码转换。

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 class2class Class2类型,但该类被重命名为Class2_V1。我想将字段类型也从LClass2重命名为LClass2_V1

ctCls1是:[email protected][changed public class Class1_V1 fields=Class1_V1.class2:LClass2;, [email protected][public Class1_V1()V], methods=]

PS:我已经加载的不同仪器类两个版本,所以这是在我的情况的最佳途径。此外,我已经搜索了这个问题,但没有解决方案来解决它,例如this link描述了重命名字段,但没有键入。

+0

请注意,我总是追加“_V1”或“_V2 ”。所以,如果你帮我重命名'LClass1_V1'或'LClass1_V2'就足够了。 – Aadarsh

+0

你不能完全删除该字段,然后添加一个新的字段与新的名称和新的类型? – Nicholas

+0

我可以,但删除然后添加并使用'setType()'没有区别 – Aadarsh

回答

1

根据Javassistdocumentation

一类新的可被定义为现有类的副本。下面的程序做的是:

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

该程序首先获得用于类Point的CtClass对象。

然后它调用setName()给这个CtClass对象一个新的名字Pair。

在此调用之后,由CtClass对象表示的类定义中的类名定义的所有类名都会从点对点变为对。类定义的另一部分不会改变。

编辑: 为了在一个类中重命名字段类型,你可以浏览类,并通过Javassist类型得到它CtField

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

我正在重命名'class2',但'class1'有一个'class2'类型的字段,您所指的方法不能重命名'class1'中的类型。 – Aadarsh