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

можно ли заменить метод класса на 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 или есть альтернативы?

Спасибо


person Phoebus    schedule 12.01.2017    source источник


Ответы (1)


Ваш ModifiedDoSomething::saySomethign метод не static. Если вы хотите делегировать метод экземпляра, вам нужно запустить MethodDelegation.to(new ModifiedSomething()).

person Rafael Winterhalter    schedule 13.01.2017