java - Android 上可以使用 ByteBuddy 进行 MethodDelegation 拦截吗?

标签 java android byte-buddy

Android中是否可以用ByteBuddy替换类的方法?

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

当我使用固定值进行拦截时,它工作得很好,但是我需要完全替换该方法的实现,或者至少拦截开头,调用原始方法,然后再次拦截到最后。 ByteBuddy 是否可以做到这一点,或者有其他选择吗?

谢谢

最佳答案

您的 ModifiedDoSomething::saySomethign 方法不是静态。如果您想委托(delegate)给实例方法,则需要运行 MethodDelegation.to(new ModifiedSomething())

关于java - Android 上可以使用 ByteBuddy 进行 MethodDelegation 拦截吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41619626/

相关文章:

java - Mockito 无法模拟此类 : Mockito can only mock non-private & non-final classes

java - 使用 Byte Buddy 拦截对我的 Java 和 Groovy 代码的方法调用 : Strange java. lang.VerifyError

java - 使用参数化 Junit 测试获取运行时异常

java - 设计带有2个外键的spring data jpa注释类

Java SortedSet + Comparator,与equals()一致性问题

带有复选框的 Android ListView 在滚动时松散选中的项目

java - 如何使用代码生成跟踪 POJO 的状态

java - HibernatebulkUpdate() 以 List 作为参数

android - 从 xml 资源加载后更新/更改 Android 中的动画

android - 如何从命令行 SDK 管理器添加 Google 存储库