2016-12-02 9 views
1

Byte Buddyでいくつかのメソッドの可視性を変更することは可能ですか?私はプライベートな静的メソッドを持つユーザークラスを持っているので、それらのメソッドにいくつかの呼び出しを委譲する必要がありますが、プライベートなので現在失敗しています。だから、上記のメソッドをpublic修飾子を追加してトランスフォームすることで、ユーザークラスを再定義できるかどうかと思います。レコードのメソッドの可視性を変更する

、バイトバディはまだ、次の例外で失敗としてではなく、効果としてターゲットJavaメソッドのsetAccessible(true)メソッドを呼び出す:

java.lang.IllegalStateException: class net.bytebuddy.renamed.java.lang.Object$ByteBuddy$VHdvjIkb cannot see private java.lang.String org.mockaccino.MockaccinoTest.lambda$3() throws java.lang.Exception 
at net.bytebuddy.implementation.MethodCall$MethodInvoker$ForContextualInvocation.invoke(MethodCall.java:2387) 
... 

私はトリックを行う可能性がありますいくつかのAPIを見つけたが、私は私の場合には必要ではないメソッドを計測する必要があります。

例:

byteBuddy.redefine(targetClass) 
    .method(ElementMatchers.named(targetMethod.getName())) 
    .intercept(???) 
    .transform(Transformer.ForMethod.withModifiers(Visibility.PUBLIC)) 
    .make() 
    .load(getClassLoader(), ClassReloadingStrategy.fromInstalledAgent()); 

私の質問は:再定義されているソースメソッドの本体を呼び出すことができますインターセプターはありますか?

また、ターゲットメソッドを公開する別の方法がありますか?

答えて

2

メソッドの修飾子を再定義すると、ロードされたクラスでは機能しません。 JVMは、メソッドを追加/削除したり、メソッドのプロパティを変更する再定義を拒否します。その修飾子。

公開するには、SuperMethodCall.INSTANCEでメソッドを実装する再定義ではなく、リバースメントを適用する必要があります。この変換は、問題のクラスの最初の読み込みの前に適用する必要があります。

関連する問題