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

Другие вопросы по тегам