2010-09-28 52 views
0

我有與下面的方法在飛行類加載與罐子

@Override 
public Class<?> findClass(String className) throws ClassNotFoundException { 
    try { 
     /** 
     * Get a bytecode from file 
     */ 

     byte b[] = fetchClassFromFS(pathtobin + File.separator 
      + className.replaceAll("\\.", escapeSeparator(File.separator)) + ".class"); 
     return defineClass(className, b, 0, b.length); 
    } catch (FileNotFoundException ex) { 
     return super.findClass(className); 
    } catch (IOException ex) { 
     return super.findClass(className); 
    } 
} 

這就像你看到的擴展類一個ClassLoader的defineClass使用()方法從其父 - 類加載器。問題是當我試圖執行一個類'(我收到我的ClassLoader擴展 - 讓它是ru.xmppTesting.test.Disco)方法getMethods(),同時得到這個類的實例我得到以下

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/Header 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Unknown Source) 
    at java.lang.Class.privateGetPublicMethods(Unknown Source) 
    at java.lang.Class.getMethods(Unknown Source) 
    at DOTGraphCreator.createGraphFromClasses(DOTGraphCreator.java:85) 
    at DOTGraphCreator.generateDotGraphFile(DOTGraphCreator.java:56) 
    at DOTGraphCreator.main(DOTGraphCreator.java:46) 
Caused by: java.lang.ClassNotFoundException: org.apache.http.Header 
    at java.lang.ClassLoader.findClass(Unknown Source) 
    at SourceClassLoader.findClass(SourceClassLoader.java:27) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    ... 7 more 

據我可以看到,這是因爲類org.apache.http.Header找不到定義。因爲它不是。

所以這裏有一個問題:

怎麼能和我必須定義和(從我的.jar庫以及其他豐富內容)與ru.xmppTesting.test.Disco的定義及其他類似沿着鏈接此頭類讓他們在飛行中定義?

回答

0

如果您正在從您的dinamic加載類導入org.apache.http.Header,您需要它在您的類路徑中可訪問。

如果你不希望加載在classpath所有可能用到的罐子,你可以嘗試用一個黑客我發現here

import java.lang.reflect.*; 
import java.io.*; 
import java.net.*; 

public class ClassPathHacker { 

private static final Class[] parameters = new Class[]{URL.class}; 

public static void addFile(String s) throws IOException { 
    File f = new File(s); 
    addFile(f); 
}//end method 

public static void addFile(File f) throws IOException { 
    addURL(f.toURL()); 
}//end method 


public static void addURL(URL u) throws IOException { 

    URLClassLoader sysloader = (URLClassLoader)ClassLoader.getSystemClassLoader(); 
    Class sysclass = URLClassLoader.class; 

    try { 
     Method method = sysclass.getDeclaredMethod("addURL",parameters); 
     method.setAccessible(true); 
     method.invoke(sysloader,new Object[]{ u }); 
    } catch (Throwable t) { 
     t.printStackTrace(); 
     throw new IOException("Error, could not add URL to system classloader"); 
    }//end try catch 

}//end method 

}//end class 

但是,我必須說,這不可能是便攜式對某些JVM(並不總是SystemClassLoader是一個URLClassLoader的一個子類)...

* 編輯:*其實,當你更換了自己的類加載器,也許你有一些麻煩......

+0

這就是我應該馬上。但是我的目標是製作一個簡單的應用程序,用於加載選定的類(用於註釋和方法解析目的),並且不需要知道該類包含哪些內容以及導入的內容和它的功能。也許你可以提供一個更好的方法來實現呢? – endarkened 2010-09-29 12:58:55

+0

@endarkened:這意味着在加載時分析導入的類,並在您的文件系統中找到具有所需類的JAR的位置,並從此JAR導入中解決可能的輔助依賴關係...我認爲這不僅僅是相當的難以得到。讓我看看我能否找到一些東西。 – 2010-09-29 13:39:50