2013-04-14 87 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

我已经尝试重命名它,它有相同的结果。 –