2014-11-03 13 views
13

Sto cercando di caricare una classe specifica utilizzando javassist, sto facendo questo all'interno di un metodo di pre-main come follwoing:javassist il caricamento di un file di classe nel metodo pre-main (strumentazione java)

public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, 
         ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException 
{ 
    byte[] byteCode = classfileBuffer; 

    if(className.toLowerCase().endsWith("class1")) 
    { 
     ClassPool classPool = ClassPool.getDefault(); 
     CtClass ctClass = classPool.get("com.class2"); 
    } 
} 

ma unfortuanetly, sto diventando un NotFoundException ....

com.class2 è una classe che verrà caricato dal caricatore di classe dopo il caricamento class1, ma io alettato per aggiungere un nuovo metodo per Class1 che ha un tipo di ritorno com.class2

Ho provato tutte le soluzioni all'interno di stackoverflow.co ma senza risultati .....

Infine, sia class1 che class2 sono nello stesso pacchetto e all'interno dello stesso file JAR, class1 ha un membro di tipo class2, ma non ho idea del perché questo classpool possa ' t caricare il secondo.

l'analisi dello stack qui:

Exception: javassist.NotFoundException: com.Class2 
javassist.NotFoundException: com.Class2 
at javassist.ClassPool.get(ClassPool.java:439) 
at javassist.ClassPool.getCtClass(ClassPool.java:504) 
at com.stuff.MainAppletTransformer.transform(MainAppletTransformer.java:69) 
at sun.instrument.TransformerManager.transform(Unknown Source) 
at sun.instrument.InstrumentationImpl.transform(Unknown Source) 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClass(Unknown Source) 
at java.security.SecureClassLoader.defineClass(Unknown Source) 
at java.net.URLClassLoader.defineClass(Unknown Source) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader.defineClassHelper(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader.access$100(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader$2.run(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader$2.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at sun.plugin2.applet.Plugin2ClassLoader.findClassHelper(Unknown Source) 
at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source) 
at java.lang.ClassLoader.loadClass(Unknown Source) 
at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source) 
at sun.plugin2.applet.Plugin2Manager.initAppletAdapter(Unknown Source) 
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 

risposta

11

Il tuo metodo non ha un valore di ritorno e sarebbe quindi non la compilazione. Posso comunque dire cosa sta andando male: non stai configurando un percorso di ricerca corretto. Dalla traccia dello stack, sembra che tu stia utilizzando un'applet protetta da uno specifico ClassLoader. Questo programma di caricamento classi non è visibile a Javassist nella tua versione attuale.

Utilizzando ClassPool.getDefault(), si è looking up information from the system class path. Per l'applet, probabilmente sarà necessario add the class loader che viene passato come argomento dal metodo transformatio.

È possibile aggiungere un caricatore di classe al percorso di ricerca di Javassist da

ClassPool classPool = ClassPool.getDefault(); 
classPool.appendClassPath(new LoaderClassPath(classLoader)); 

Dopo aggiungendo questo percorso, il tuo esempio dovrebbe funzionare.

+0

Per prima cosa, devo ringraziarvi tanto per la risposta esperta, è stato il mio problema principale per circa tre settimane a come possiamo caricare quella classe e alla fine è stata risolta dalla vostra ottima risposta, Riguardo al metodo, ho appena provato a chiarire il mio punto principale ma sicuramente ha un valore di ritorno .... Grazie mille per il tuo aiuto di nuovo. – ManKeer

Problemi correlati