我正在开发一款带有第三方库的Android应用程序。我想要替换库中的方法调用。请注意,我无法获取库的源代码,因此必须在运行时进行更改。
例如,假设库中的Foo类中有一个doA()方法。
例如,假设库中的Foo类中有一个doA()方法。
class Foo {
doA() {
//method body
}
...
}
我想替换doA()
方法的内容为我的代码。我进行了一些探索,并发现以下stackoverflow线程:Replacing a method call in a class at runtime。该线程告诉我可以尝试使用一个称为javassist的字节码操作库。我发现有一个Android版本的库在这里:https://github.com/crimsonwoods/javassist-android。我导入了该库并编写了以下代码:
try {
final ClassPool cp = ClassPool.getDefault(getApplicationContext());
CtClass cc = cp.get("Foo");
CtMethod method = cc.getMethod("doA","()V");
method.setBody("{ java.lang.System#out.println(\"doA() is called.\");}");
cc.writeFile(); //where the exception was raised
} catch (Exception e) {
e.printStackTrace();
}
但是在执行cc.writeFile()
时,我遇到了一个异常。它是"FileNotFoundException: ./Foo.class: open failed: ENOENT (No such file or directory)"
。我不知道如何解决这个问题。