2017-03-22 57 views
0

我有一个名为Sample的类,我需要将变量messageID重命名为NameID,这样相应的getter和setter也会被更新。如何使用javassist动态重命名字符串变量?

public class Sample{ 

    String messageID; 

    public String getMessageID() { 
     return MessageID; 
    } 

    public void setMessageID(String messageID) { 
     MessageID = messageID; 
    } 
} 

回答

1

用Javassist可以更改字段名称和所有从旧的字段名称到新的引用。

ClassPool classpool = ClassPool.getDefault(); 
    CtClass ctClass = classpool.get(Sample.class.getName()); 
    CtField field = ctClass.getField("messageID"); 
    CodeConverter codeConverter = new CodeConverter(); 
    codeConverter.redirectFieldAccess(field, ctClass, "NameID"); 
    ctClass.instrument(codeConverter); 
    field.setName("NameID"); 

如果你不知道何用Javassist你应该阅读本教程here 诀窍关于“重新布线”的所有字段引用使用CodeConverter将替换为CtField领域的所有引用的参考文献做到名为NameID的字段ctClass。请记住,在将该字段重命名为NameID之前,需要完成此操作。

但是,您应该记住所有引用都已更新,但set/get方法名称仍为getMessageIDsetMessageID。你可以很容易地改变,使用ctClass相同的参考如下:

CtMethod getter = ctClass.getDeclaredMethod("getMessageID"); 
getter.setName("getNameId"); 
CtMethod setter = ctClass.getDeclaredMethod("setMessageID"); 
setter.setName("setNameId");