如何使用javassist动态重命名String变量?

时间:2017-03-22 10:47:13

标签: reflection javassist

我有一个名为Sample的类,我需要将变量messageID重命名为NameID,以便更新相应的getter和setter。

public class Sample{

    String messageID;

    public String getMessageID() {
        return MessageID;
    }

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

1 个答案:

答案 0 :(得分: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的字段的引用。请记住,在将字段重命名为getMessageID之前,需要先完成此操作。

但是您应该记住所有引用都已更新,但set / get方法名称仍为setMessageIDctClass。您可以使用CtMethod getter = ctClass.getDeclaredMethod("getMessageID"); getter.setName("getNameId"); CtMethod setter = ctClass.getDeclaredMethod("setMessageID"); setter.setName("setNameId"); 的相同引用轻松更改它,如下所示:

?- maplist(nth1(I), [[a,b,c],[1,2,3],[x,y,z]], X).
I = 1,
X = [a, 1, x] ;
...