我有以下课程
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
答案 0 :(得分:3)
包含语句b.name =“hello”的示例代码片段;没有被检测,因此它写的值不会转换为大写。 ExprEditor只能转换由它检测的类的字段访问。如果您希望每次写入'name'字段转换为大写,您将必须检测包含该字段的write语句的每个类。