2015-05-17 14 views
6

Ich versuche löschen eine Methode aus einer Klassendatei mit Javassist.Wie entferne ich eine Methode mit Javassist?

Zielklasse: "RemoveMethod".

Zielmethode: "DoubleCheck".

Meine Codes:

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

Dann den Code mit Hilfe der Datei "javassist.jar" laufen:

javac -cp javassist.jar cRepair.java 

dann die Zielklasse überprüfen:

javap -verbose RemoveMethod.class 

Verfahren "DoubleCheck" ist immer noch da!

Das sieht wirklich merkwürdig aus. Warum konnte das passieren und wie konnte es behoben werden?

+0

der javac call kompiliert nur Ihren Code, er führt ihn nicht aus. – muued

+0

@muued, Danke Mann. Es macht Sinn! Ich habe versucht, den Code mit: "java cRepair", aber das System sagt "konnte nicht finden oder laden die Hauptklasse cRepair" – Delibz

+0

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

Antwort

3

Ihr Code liest den Bytecode Ihrer Klasse in den Speicher und entfernt die Methode. Aber es schreibt den modifizierten Bytecode nicht zurück in eine Datei .class. Sie können CtClass#writeFile() anrufen, um das zu tun.

+0

Vielen Dank für Ihre Empfehlung. Ich habe meinen Code geändert (wie gezeigt) und es erneut versucht, aber die neue Klasse "ModifiedMethod" wurde nicht generiert. – Delibz

+0

Der Parameter in 'writeFile()' definiert das * Verzeichnis * in dem Ihre Klasse geschrieben wird . Nachdem Sie Ihren Code ausgeführt haben, sollten Sie ein Verzeichnis mit dem Namen 'ModifiedMethod' haben, das die modifizierte' RemoveMethod' Klasse enthält. Ich habe Ihren Beispielcode ausgeführt und es hat funktioniert. Javadoc von CtClass: http://www.csg.ci.iu-tokyo.ac.jp/~chiba/javassist/html/javassist/CtClass.html#writeFile-- –

+0

Es tut mir leid, dich raus zu bringen, aber ich bin immer noch verwirrt. ..Ich habe das Verzeichnis eingerichtet und meinen Code wiederholt ... die erwartete Klassendatei wurde nach dem Ausführen des Codes auf meinem Schreibtisch erstellt .... Vielen Dank für Ihre Geduld noch einmal ... – Delibz