2015-05-17 8 views
6

Sto provando a eliminare un metodo da un file di classe che utilizza Javassist.Come rimuovere un metodo usando Javassist?

classe di destinazione: "RemoveMethod".

metodo di destinazione: "DoubleCheck".

miei codici:

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

Poi, eseguire il codice usando il file "javassist.jar":

javac -cp javassist.jar cRepair.java 

quindi controllare la classe di destinazione:

javap -verbose RemoveMethod.class 

Il metodo "DoubleCheck" è ancora lì!

Questo sembra davvero strano. Perché questo potrebbe accadere e come risolverlo?

+0

la chiamata javac compila semplicemente il codice, non lo esegue. – muued

+0

@muued, grazie amico. Ha senso! Ho cercato di eseguire il codice utilizzando: "java cRepair", ma il sistema dice "non potrebbe trovare o caricare la classe principale cRepair" – Delibz

+0

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

risposta

3

Il codice legge il bytecode della classe in memoria e rimuove il metodo. Ma non scrive il bytecode modificato in un file .class. È possibile chiamare CtClass#writeFile() per farlo.

+0

Grazie mille per il tuo elogio. Ho appena modificato il mio codice (come mostrato) e ritentato di nuovo, ma la nuova classe "ModifiedMethod" non è stata generata ...... – Delibz

+0

Il parametro in 'writeFile()' definisce la * directory * in cui verrà scritta la classe . Quindi dopo aver eseguito il codice dovresti avere una directory chiamata 'ModifiedMethod' che contiene la classe' RemoveMethod' modificata. Ho eseguito il tuo codice di esempio e ha funzionato. Javadoc di CtClass: http://www.csg.ci.iu-tokyo.ac.jp/~chiba/javassist/html/javassist/CtClass.html#writeFile-- –

+0

Mi dispiace metterti fuori ma sono ancora confuso. .. Ho impostato la directory e ritentato il mio codice .... il file di classe previsto è stato generato sulla mia scrivania dopo aver eseguito il codice .... Grazie per la vostra pazienza ancora una volta ... – Delibz

Problemi correlati