2017-01-12 2 views
0

AndroidのByteBuddyでクラスのメソッドを置き換えることは可能ですか?AndroidではByteBuddyでMethodDelegationインターセプトが可能ですか?

public class DoSomething { 
    public void saySomething() { 
     Log.d("DoSomething", "Hello World"); 
    } 
} 

public class ModifiedDoSomething { 
    public void saySomething() { 
     Log.d("ModifiedDoSomething", "Hello Injected"); 
    } 
} 

new ByteBuddy() 
    .subclass(DoSomething.class) 
    .method(ElementMatchers.named("saySomething")) 
    .intercept(MethodDelegation.to(ModifiedDoSomething.class)) 
    .make() 
    .load(DoSomething.class.getClassLoader(), 
     new AndroidClassLoadingStrategy(f)) 
    .getLoaded() 
    .newInstance() 
    .saySomething(); 

私はこのコードをしようとすると、それはスロー:

java.lang.IllegalArgumentException: None of [] allows for delegation from public void DoSomething.saySomething() 

私はFixedValueで傍受した場合、それだけで正常に動作します、しかし、私は完全にメソッドの実装を置き換えるか、または少なくともにする必要があります最初を傍受し、元のものを呼び出し、最後にもう一度傍受する。これは何とかByteBuddyで可能ですか、それとも選択肢がありますか?

おかげ

答えて

1

あなたModifiedDoSomething::saySomethign方法はstaticではありません。インスタンスメソッドに委譲する場合は、MethodDelegation.to(new ModifiedSomething())を実行する必要があります。

関連する問題