2014-11-03 32 views
13

Próbuję załadować specyficzną klasę używając javassist, robię to wewnątrz sprzed głównej metody jako follwoing:javassist ładuje plik klasy w metodzie pre-main (instrumentacji 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"); 
    } 
} 

ale unfortuanetly, dostaję NotFoundException ....

com.class2 jest klasa, która zostanie załadowany przez loader klasy po załadowaniu Class1, ale nned aby dodać nową metodę, która ma Class1 typ zwrotu com.class2

Próbowałem wszystkich rozwiązań wewnątrz stackoverflow.co m, ale bez żadnych wyników .....

Wreszcie, zarówno klasa 1, jak i klasa2 są w tym samym pakiecie i wewnątrz tego samego pliku JAR, klasa 1 ma element typu class2, ale nie mam pojęcia, dlaczego ten classpool może " t załaduj drugi.

ślad stosu tutaj:

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) 

Odpowiedz

11

Twoja metoda nie posiada wartości zwracanej, a zatem nie będzie skompilować. Mogę jednak nadal powiedzieć, co dzieje się nie tak: Nie konfigurujesz poprawnej ścieżki wyszukiwania. Ze śledzenia stosu wygląda na to, że uruchamiasz aplet, który jest chroniony przez konkretną ClassLoader. Ten program ładujący klasy nie jest widoczny dla Javassist w twojej obecnej wersji.

Używając ClassPool.getDefault(), jesteś looking up information from the system class path. Dla twojego apletu prawdopodobnie będziesz musiał add the class loader, który jest przekazywany przez metodę transformatową jako argument.

Możesz dołączyć ładującego klasy do ścieżki wyszukiwania Javassist poprzez

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

Po dodanie tej ścieżki, Twój przykład powinien działać.

+0

Po pierwsze, muszę ci bardzo podziękować za odpowiedź eksperta, to był mój główny problem przez około trzy tygodnie, jak możemy załadować tę klasę, a na końcu jest to rozwiązane przez twoją wspaniałą odpowiedź. Odnośnie tej metody, właśnie próbowałem wyjaśnij mój główny punkt, ale z pewnością ma on wartość zwrotu ... Bardzo dziękuję za pomoc. – ManKeer