Android 上是否可以使用 ByteBuddy 进行 MethodDelegation 拦截?
Is MethodDelegation intercept with ByteBuddy possible on Android?
是否可以用 Android 中的 ByteBuddy 替换 class 的方法?
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 来说是可行的还是有其他选择?
谢谢
您的 ModifiedDoSomething::saySomethign
方法不是 static
。如果要委托给实例方法,需要运行 MethodDelegation.to(new ModifiedSomething())
.
是否可以用 Android 中的 ByteBuddy 替换 class 的方法?
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 来说是可行的还是有其他选择?
谢谢
您的 ModifiedDoSomething::saySomethign
方法不是 static
。如果要委托给实例方法,需要运行 MethodDelegation.to(new ModifiedSomething())
.