Как удалить метод с помощью Javassist?

Я пытаюсь удалить метод из файла класса с помощью Javassist.

Целевой класс:"RemoveMethod".

Целевой метод:"DoubleCheck".

Мои коды:

package javassist;     
        import java.io.IOException;
        import java.lang.reflect.Method;
        import javassist.*;

public class cRepair {
    public static void main(String[] args) throws NotFoundException, IOException, CannotCompileException{
    ClassPool pool = ClassPool.getDefault();  
    CtClass ctClass = pool.get("javassist.RemoveMethod");  
    CtMethod ctm = ctClass.getDeclaredMethod("DoubleCheck");  
    ctClass.removeMethod(ctm);
    ctClass.writeFile("C:/Users/workspace/Javaproject1/src/javassis"); 
 }
}

Затем запустите код, используя файл «javassist.jar»:

javac -cp javassist.jar cRepair.java

Затем проверьте целевой класс:

javap -verbose RemoveMethod.class

Метод "DoubleCheck" по-прежнему существует!

Это выглядит действительно странно. Почему это могло произойти и как это исправить?


person Delibz    schedule 17.05.2015    source источник
comment
вызов javac просто компилирует ваш код, а не запускает его.   -  person muued    schedule 17.05.2015
comment
@muued, спасибо, чувак. Это имеет смысл! Я попытался запустить код, используя: java cRepair, но система говорит, что не может найти или загрузить основной класс cRepair   -  person Delibz    schedule 17.05.2015
comment
беги java -cp javassist.jar javassist.cRepair   -  person muued    schedule 17.05.2015
comment
@muued, спасибо за ответ. Однако система по-прежнему говорит, что не удалось найти или загрузить основной класс cRepair. Действительно странно.   -  person Delibz    schedule 17.05.2015
comment
просто научитесь запускать скомпилированный класс Java, это совершенно не связано   -  person muued    schedule 17.05.2015
comment
@мууед. Я имею в виду... после компиляции я использовал команду "java -cp javassist.jar javassist.cRepair", как вы упоминали ранее, для запуска кода, но основной класс cRepair не может быть найден или загружен...   -  person Delibz    schedule 17.05.2015
comment
Давайте продолжим обсуждение в чате.   -  person muued    schedule 17.05.2015


Ответы (1)


Ваш код считывает байт-код вашего класса в память и удаляет метод. Но он не записывает измененный байт-код обратно в файл .class. Вы можете позвонить CtClass#writeFile(), чтобы сделать это.

person Stefan Ferstl    schedule 17.05.2015
comment
Большое спасибо за вашу похвалу. Я только что изменил свой код (как показано) и повторил попытку, но новый класс ModifiedMethod не был сгенерирован...... - person Delibz; 17.05.2015
comment
Параметр в writeFile() определяет каталог, в который будет записан ваш класс. Итак, после запуска вашего кода у вас должен быть каталог с именем ModifiedMethod, который содержит модифицированный класс RemoveMethod. Я запустил ваш пример кода, и он сработал. Javadoc CtClass: csg.ci.iu-tokyo.ac.jp/~chiba/javassist/html/javassist/ - person Stefan Ferstl; 17.05.2015
comment
Извините, что отключил вас, но я все еще в замешательстве... Я настроил каталог и повторил свой код... ожидаемый файл класса был сгенерирован на моем столе после запуска кода.... Спасибо за ваше терпение еще раз ... - person Delibz; 17.05.2015
comment
@Delibz Итак, проблема решена, верно? Я думаю, вы хотите заменить исходный файл RemoveMethod.class модифицированным. В этом случае вы должны указать методу writeFile() записать новый файл .class в место, где находится исходный файл. - person Stefan Ferstl; 17.05.2015
comment
Не могли бы вы рассказать мне, как вы запускали код? Я только что попробовал: java cRepair, но произошла ошибка: не удалось найти или загрузить основной класс cRepair - person Delibz; 17.05.2015