2015-05-17 18 views
6

Próbuję usunąć metodę z pliku klasy przy użyciu Javassist.Jak usunąć metodę przy użyciu Javassist?

Klasa docelowa: "RemoveMethod".

Metoda docelowa: "DoubleCheck".

Moi kody:

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"); 
} 
} 

Następnie uruchomić kod za pomocą pliku "javassist.jar":

javac -cp javassist.jar cRepair.java 

następnie sprawdzić klasę docelowa:

javap -verbose RemoveMethod.class 

Sposób "DoubleCheck" nadal tam jest!

To wygląda naprawdę dziwnie. Dlaczego tak się stało i jak to naprawić?

+0

wywołanie javac po prostu kompiluje twój kod, nie uruchamia go. – muued

+0

@muued, Dzięki człowieku. Ma sens! Próbowałem uruchomić kod za pomocą: "java cRepair", ale system mówi "nie mógł znaleźć lub załadować głównej klasy cRepair" – Delibz

+0

uruchom 'java -cp javassist.jar javassist.cRepair' – muued

Odpowiedz

3

Twój kod odczytuje bajt kodu twojej klasy do pamięci i usuwa tę metodę. Ale nie zapisuje zmodyfikowanego kodu bajtowego z powrotem do pliku .class. Aby to zrobić, możesz zadzwonić pod numer CtClass#writeFile().

+0

Dziękuję bardzo za pochwałę. Właśnie zmodyfikowałem mój kod (jak pokazano) i ponowiłem go ponownie, ale nowa klasa "ModifiedMethod" nie została wygenerowana ...... – Delibz

+0

Parametr w 'writeFile()' definiuje * katalog *, gdzie twoja klasa zostanie zapisana . Po uruchomieniu kodu powinieneś mieć katalog o nazwie "ModifiedMethod", który zawiera zmodyfikowaną klasę 'RemoveMethod'. Uruchomiłem twój przykładowy kod i zadziałało. Javadoc z CtClass: http://www.csg.ci.iu-tokyo.ac.jp/~chiba/javassist/html/javassist/CtClass.html#writeFile-- –

+0

Przepraszam, że Cię wypraszam, ale wciąż jestem zdezorientowany. ... Ustawiłem katalog i ponowiłem mój kod ... oczekiwany plik klasy został wygenerowany na moim biurku po uruchomieniu kodu .... Jeszcze raz dziękuję za cierpliwość ... – Delibz