2014-11-03 81 views
13

我試圖用Javassist進行,我在做這個,前期主要方法爲follwoing內裝載特定類:了Javassist加載在預主要方法(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"); 
    } 
} 

但unfortuanetly,我得到一個NotFoundException ....

com.class2是將被加載後的Class1的類加載器加載的類,但我NNED添加新的方法,有一個名爲class1返回類型com.class2

我試過了stackoverflow.co中的所有解決方案m但沒有任何結果.....

最後,class1和class2都在同一個包中,並且在同一個JAR文件中,class1有一個類型爲class2的成員,但我不知道爲什麼這個classpool可以' t加載第二個。

堆棧跟蹤這裏:

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) 

回答

11

您的方法沒有一個返回值,因此不會編譯。不過,我仍然可以知道發生了什麼問題:您沒有設置正確的搜索路徑。從你的堆棧跟蹤中,你似乎在運行一個被特定的ClassLoader屏蔽的applet。此類加載器在當前版本中對Javassist不可見。

通過使用ClassPool.getDefault(),您是looking up information from the system class path。對於你的小程序,你可能需要add the class loader,這是由轉換方法作爲參數移交的。

您可以通過

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

追加一個類加載器Javassist進行的搜索路徑追加此路徑後,你的榜樣應該工作。

+0

首先,我需要非常感謝你的專家答覆,這是我的三個星期的主要問題,我們如何加載該類,並最終通過你的偉大答案來解決。關於方法,我只是試圖澄清我的要點,但肯定它有回報價值....非常感謝您的幫助。 – ManKeer 2014-11-04 06:26:53