2012-02-12 5 views
1

나는 다음과 같은 클래스에게 그것은 다음과 같은 사용와 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 
01을 제공합니다

무엇이 누락 되었습니까? 그것은 내가 쉽게 성취 할 수 있어야하는 것들 중 하나처럼 보입니다.

모든 클래스에서 blanket "fieldAccess.replace"를 수행해야한다고 말하지 마십시오. O.O

+0

첫 번째 인쇄물이 ""대신 println (b.name)으로되어 있습니까? –

+0

예. 고마워요 @ PeterLiljenberg –

답변

3

b.name = "hello"문을 포함하는 예제 코드 단편; 인스트루먼트되고 있지 않으므로이 값은 대문자로 변환되지 않습니다. ExprEditor는 계측 된 클래스에서 필드 액세스 만 변환 할 수 있습니다. 'name'필드에 대한 모든 쓰기를 대문자로 변환하려면 해당 필드에 대한 쓰기 명령문을 포함하는 모든 클래스를 인스트루먼트해야합니다.

+0

Urgh 심각하게!? * 싫은 내색 * 감사합니다! –