2013-04-14 123 views
0

我想從我指定的目錄加載一個類。我做了一些研究,取得這樣的:加載外部類

ArrayList<Object> plugins = new ArrayList<Object>(); 
ClassLoader loader = Reflection.class.getClassLoader(); 

public Reflection() 
{ 
    load(); 
} 

public void load() 
{ 

    File f = new File(Full directary); 

    ClassLoader loader = null; 
    try 
    { 
     loader = new URLClassLoader(new URL[] 
     { f.toURI().toURL() }, getClass().getClassLoader()); 
    } 
    catch (MalformedURLException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    for (File classFile : f.listFiles(new FilenameFilter() 
    { 
     public boolean accept(File dir, String name) 
     { 
      return name.endsWith(".class"); 
     } 
    })) 
    // Start for loop. 
    { 
     try 
     { 
      String filename = classFile.getName(); 
      System.out.println(filename); 
      Class<?> cls = loader.loadClass(filename.replace(".class", "")); 
      System.out.println(cls.getSuperclass().getName()); 
     } 
     catch (Exception ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
} 

我得到一個NoClassDefFoundError錯誤:

異常在線程 「主要」 java.lang.NoClassDefFoundError:mTest123g(錯名:網/ xcaliber /反射/測試)

它發現類很好,但然後無法加載它。我做了一個基本的界面:

String getName(); 

這就是它的全部內容;這裏是我正在加載的類:

public Test() 
{ 
    // TODO Auto-generated constructor stub 
} 

@Override 
public String getName() 
{ 
    return "Test"; 
} 

這確實實現了接口。讓我知道它的問題。

+0

嘗試使用完全限定名稱加載類。 – NINCOMPOOP

回答

0

顯然你有一個類和文件名亂了。

Exception in thread "main" java.lang.NoClassDefFoundError: mTest123g (wrong name: net/xcaliber/reflection/Test) 

所以,你加載它爲java mTest123g。類加載器在某些net.xcaliber.reflection包中需要mTest123g.class而不是Test類。

+0

我已經嘗試重命名它,它有相同的結果。 –