2017-11-03 2 views
0

Javassist proxyFactoryは、メソッドインターセプタで実行時にプロキシを作成できます。しかし、メソッド・インターセプタをクラス・ファイルを変更することによってクラスに静的に追加する方法はありますか?バイトコードツール:メソッドインターセプタをクラスに追加する(プロキシではない)

たとえば、Fooクラスのメソッドを呼び出す前に、Fooクラスには100個のメソッドがあり、Fooインスタンスが初期化されているかどうかを確認する必要があります。

public class Foo { 

    public void methodA() { 
     ... 
    } 

    public void methodB() { 
     ... 
    } 

    public void methodC() { 
     ... 
    } 

    .... 
} 

このようなメソッドインターセプタを追加するには、クラスファイルを変更する方法はありますか。 1つの方法は、各メソッドの先頭にコードを追加することです。より良い方法がありますか?

cglibなどの他のバイトコードツールはどうですか?

答えて

0

これをachiveするByteBuddyとの2つのオプションがあります。

  • 使用の再定義/特徴をリベースは、 - あなたはの下で「タイプの再定義」/「型リベース」タグをByteBuddy tutorialの詳細を確認することができます。ここでの制限は、ターゲットクラスがロードされる前にこの種の変換を行う必要があることです。
  • Javaエージェント - クラスの前に実行されるエージェントは、既存のクラスを変更できるようにロードされます。 ByteBuddyには素敵なAgentBuilder(tutorial - 「Javaエージェントの作成」)が付属しています。実行時に特殊なByteBuddyエージェントをインストールすることも可能です(前述のチュートリアルの例)。

    class Foo { 
        String m() { return "foo"; } 
    } 
    
    class Bar { 
        String m() { return "bar"; } 
    } 
    
    ByteBuddyAgent.install(); 
    Foo foo = new Foo(); 
    new ByteBuddy() 
        .redefine(Bar.class) 
        .name(Foo.class.getName()) 
        .make() 
        .load(Foo.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent()); 
    assertThat(foo.m(), is("bar")); 
    
関連する問題