Android заменить вызов метода во время выполнения
Я занимаюсь разработкой приложения для Android со сторонней библиотекой. Я хочу заменить вызов метода в библиотеке. Обратите внимание, что я не могу получить исходный код библиотеки, поэтому мне нужно изменить его во время выполнения.
Например, предположим, что есть doA()
метод в классе Foo в библиотеке
class Foo {
doA() {
//method body
}
...
}
Я хочу заменить тело метода doA()
с моим собственным кодом. Я провел некоторое исследование и нашел следующий поток stackru: замена вызова метода в классе во время выполнения. Поток сообщает мне, что я могу попробовать библиотеку манипулирования байт-кодом под названием 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)"
, Я не знаю, как решить эту проблему.
1 ответ
Ваш код, вероятно, пытается сохранить новый файл класса, что невозможно. Между Java и Android есть огромные различия, поскольку Android использует не обычные файлы.class, а файл.dex.
Вы должны следовать этому примеру: https://github.com/crimsonwoods/javassist-android/blob/master/javassistSample/src/org/jamruby/javassistsample/MainActivity.java