Javassist - 重定向字段访问方法(不起作用)

时间:2012-02-12 10:01:24

标签: java javassist

我有以下课程

public class Booking{

    public String name;
    public String comment;

    public String session;

    public void test(){
        this.name = "hi";
    }
}

我使用以下方法进行检测:

cc.instrument(new ExprEditor(){
    public void edit(FieldAccess arg) throws CannotCompileException {
        if (arg.isWriter()) {
            StringBuffer code = new StringBuffer();
            code.append("$0.");
            code.append(arg.getFieldName());
            code.append("=$1.toUpperCase();");
            arg.replace(code.toString());
        }
    }           
});

现在我称之为:

Booking b = new Booking();
b.name = "hello";
System.out.println(b.name); // Edited correction

b.test();
System.out.println(b.name);

给我

hello // Externally, doesn't.
HI    // Internally, works as expected

我错过了什么?这似乎就是我应该能够轻松完成的事情之一。

请不要告诉我,我必须对所有课程进行毯子“fieldAccess.replace”吗? O.O

1 个答案:

答案 0 :(得分:3)

包含语句b.name =“hello”的示例代码片段;没有被检测,因此它写的值不会转换为大写。 ExprEditor只能转换由它检测的类的字段访问。如果您希望每次写入'name'字段转换为大写,您将必须检测包含该字段的write语句的每个类。