2017-02-07 3 views
0

Byte Buddy tutorialこの文書の執筆時点では、すべて説明されていますが、後に説明する方法のインターセプターはありません。 (LoggerInterceptorの例ではメソッドが返されますが、オブジェクトはありません。ChangingLoggerInterceptorの例ではオブジェクトが呼び出されますが、メソッドは呼び出されません)シンプル・アンド・イーブン・メソッド・インターセプター・バイト・バディ

私が達成したいのは、setterメソッドの実行後にオブジェクトのメソッドを呼び出すことです。 Java 6でインターセプタを作成して使用するにはどうすればよいですか?次のように

public class DirtyClass{ 

private String _sField; 
private boolean _bDirty; 

public void setField(String sField) { 
    _sField = sField; 
    //setDirty(true); to be appended after proxying 
} 
public String getField() { 
    return _sField; 
} 
public void setDirty(boolean bDirty){ 
    _bDirty = bDirty; 
} 
public boolean isDirty(){ 
    return _bDirty; 
} 
} 

DirtyClass d = new ByteBuddy().subclass(DirtyClass.class)...??? 

d.setField("dirty now"); 
System.out.println(d.isDirty()); //Expecting true 
+0

このようなものhttp://stackoverflow.com/q/37719089/13075? – Henrik

+0

setterインターセプタとして試してみましたが、例外が発生しました:java.lang.IllegalArgumentException:[...]のいずれもpublic voidからの委任を許可していません... –

答えて

4

あなたも、法の委任なしに、このようなメカニズムを実装することができます。

DirtyClass d = new ByteBuddy() 
    .subclass(DirtyClass.class) 
    .method(isSetter().and(not(named("setDirty")))) 
    .intercept(SuperMethodCall.INSTANCE.andThen(
     MethodCall.invoke(DirtyClass.class.getMethod("setDirty", boolean.class)) 
       .with(true) 
)).make() 
    .load(DirtyClass.class.getClassLoader()) 
    .getLoaded() 
    .newInstance(); 

この方法は、すべてのセッターは最初にそのスーパーメソッドを呼び出すようにして、truesetDirtyメソッドを呼び出すためにオーバーライドされます議論として。コメント内のリンクされた例も同様に機能するはずです。

インターセプターは、(いくつかのインターフェースDirtiableが実装されていることを考えると)以下のようになります。

public class Interceptor { 
    public static void getter(@SuperCall Runnable zuper, @This Diriable self) { 
    zuper.run(); 
    self.setDirty(true); 
    } 
} 

これは、インストルメントスーパークラスはメソッドをすることができ.implement(Dirtiable.class)を使用して行うことができDirtiableインタフェースを実装していることを前提としていFieldAccessorの実装を使用してフィールドを設定するように実装されています。

+0

OKです。インターセプタクラスを使用した例を共有することができますか?異なるメソッドを呼び出し、他のセッターフィルタリングを行う予定です。 –

+0

インターセプタクラスとインターセプトメソッドを自分で書くことができず、完全な引数リストのドキュメントが見つかりませんでした。 –

+0

私は自分の答えを更新しました。 –

関連する問題