2017-03-22 76 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");