2017-10-12 4 views
2

는 getter의 반환 값을 수정하려면 :재정의 클래스 위해 getter 메소드를 차단하는 것은 내가 이런 식으로 내 조언을 정의

public class MyClass { 

    private String field; 

    public MyClass() { 
    } 

    public String getField() { 
     return field; 
    } 

    public void setField(String field) { 
     this.field = field; 
    } 
} 

내 JUnit 테스트 :

public class MyInterceptor { 
    @Advice.OnMethodExit 
    public static void intercept(@Advice.Return String value) { 
     // do my changes 
    } 
} 

이 다시 정의 할 수 내 클래스 : 내 테스트를 실행할 때

@Test 
public void buddytest() throws Exception { 

    new ByteBuddy() 
     .redefine(MyClass.class) 
     .method(named("getField")) 
     .intercept(to(MyInterceptor.class)) 
     .make() 
     .load(getClass().getClassLoader(), ClassReloadingStrategy.fromInstalledAgent()); 

    MyClass myClass = new MyClass(); 
    myClass.setField("xxx"); 
    String field = myClass.getField(); 
} 

는하지만, MyInterceptor.intercept() 메서드가 호출되지 않고,이 예외가 발생합니다 :

java.lang.IllegalStateException: Cannot call super (or default) method for public java.lang.String package.MyClass.getField() 

내가 뭘 잘못하고 있니? 미리 감사드립니다.

답변

0

Advice은 장식 자처럼 보이지 않고 인터셉터로 사용하고 있습니다. 이렇게하면 Byte Buddy는 기본적으로 수퍼 메서드 호출로이 메서드를 구현하므로 사용자의 경우에는 불가능합니다. 이 패턴은 서브 클래스를 만들 때 주로 작용합니다. 다음과 같이 장식을 만들 수 있습니다.

new ByteBuddy() 
    .redefine(MyClass.class) 
    .visit(Advice.to(MyInterceptor.class).on(named("getField"))) 
+0

네, 이제 작동합니다. 감사합니다. – cstripes