2017-10-12 79 views
2

我以這種方式定義我的建議,吸氣返回值:重新定義類,爲了攔截getter方法來修改

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

這是我的課被重新定義:

public class MyClass { 

    private String field; 

    public MyClass() { 
    } 

    public String getField() { 
     return field; 
    } 

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

我的JUnit測試:

​​

但是當我運行我的測試,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