2017-03-04 9 views
1

私は、バイト・バディ1.6.9を使用して静的メソッドを再定義する方法を教えてください。ByteBuddyで静的メソッドを再定義する

私はこれを試してみました:スレッド "メイン" java.lang.IllegalStateExceptionで

例外:

public class Source { 
    public static String hello(String name) {return null;} 
} 


public class Target { 
    public static String hello(String name) { 
     return "Hello" + name+ "!"; 
    } 
} 
String helloWorld = new ByteBuddy() 
       .redefine(Source.class)    
       .method(named("hello")) 
       .intercept(MethodDelegation.to(Target.class)) 
       .make() 
       .load(getClass().getClassLoader()) 
       .getLoaded() 
       .newInstance() 
       .hello("World"); 

私は例外を次しまったクラスdelegation.Source

:既にロードタイプを注入することはできません

ありがとう

答えて

0

クラスはクラスローダーごとに1回しかロードできません。メソッドを置き換えるには、Javaエージェントを使用してJVMのHotSwap機能にフックする必要があります。

バイトバディは、そのような薬剤、使用を使用するクラスローディング戦略を提供する:

.load(Source.class.getClassLoader(), 
     ClassReloadingStrategy.fromInstalledAgent()); 

しかしこれはJavaエージェントをインストールする必要がありません。 JDKでは、プログラムによって、ByteBuddyAgent.install()(byte-buddy-agentアーティファクトに含まれています)で行うことができます。 JVMでは、コマンドラインでエージェントを指定する必要があります。

+0

Targetクラスの再定義されたメソッドで、Sourceクラスのhello()静的メソッドを再バインドしたい場合、どうしたら元の静的メソッドを呼び出すことができますか?どうもありがとうございます ! –

+0

元のメソッドの前後にコードを追加することができ、条件付きでメソッドをスキップすることができる 'Advice'クラスを見てください。それ以外の場合は、元の実装を保持するためにクラスをリベースすることしかできません。 –

+0

Adviceクラスの使い方の例について知っていますか?ありがとう! –

関連する問題