2017-03-14 7 views
0

すでに既存のフレームワークで定義されているソース・クラスを再定義したいとします。 Sourceクラスの元のインスタンスを、拡張されたクラスに自動的に置き換えたいです。ソースオブジェクトを作成するコードにアクセスすることはできません。そのため、クラスの置換は自動的にフード内で実行する必要があります。バイトバディを使用してこれを行うことは可能ですか?バイト・バディを使用してクラスを再定義する

ByteBuddyAgent.install(); 
    Source source = new ByteBuddy() 
      .subclass(Source.class) 
      .method(named("hello")).intercept(MethodDelegation.to(Target.class)) 
      .defineMethod("myNewMethod", void.class).intercept(MethodDelegation.to(Target.class)) 
      .make() 
      .load(Source.class.getClassLoader(), 
        ClassReloadingStrategy.fromInstalledAgent()) 
      .getLoaded() 
      .newInstance(); 

答えて

0

Byte Buddyを使用してクラスを再定義することは可能です。これを行うには、サブクラス化する代わりにByteBuddy::redefineまたはByteBuddy::rebaseメソッドを使用します。これらの機能を使用する最も標準的な方法は、AgentBuilderを使用するためのJavaエージェントを定義することです。

+0

ありがとう!新しいメソッドを追加する必要がありますが、サブクラス化の場合にのみ許可されます。そうでなければ、スレッド "main"の**例外が発生します。java.lang.UnsupportedOperationException:クラスの再定義が失敗しました:スキーマを変更しようとしました(フィールドの追加/削除)** –

+0

私は実際にこれをしようとしている:私は、特定のインターフェイスを実装するオブジェクトのインスタンスがあります。現在の実装では、同じインタフェースの新しいオブジェクトが作成され、ほとんどの呼び出しが元のオブジェクトに委譲されます。また、メソッドのいくつかを変更し、いくつかのメソッドを追加します。私が達成したいのは、インスツルメンテーションを使用することです。元のインターフェースが変更されるたびに新しいメソッドを装飾オブジェクトに追加する必要はありません。私は最良の方法は、サブクラス化を使用して、**メソッド(isDeclaredBy(Source.class))**を使用してインターフェイスのすべてのメソッドを委譲することだと思います** –

+0

Javaエージェントを使用してクラスを置き換えることはできません。メソッドの内部にカスタムディスパッチロジック。 'Advice'コンポーネントを調べることをお勧めします。 –

関連する問題