2017-01-12 4 views
0

Можно ли заменить метод класса ByteBuddy на Android?Возможно ли перехват MethodDelegation с ByteBuddy на Android?

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()).