2016-09-07 23 views
0

我有一些问题,如何从另一个目录爪哇 - 类初始包从另一个目录

File file=new File("D:\\java\\myproject\\Name_pack\\time\\MyClass.class"); 
URL[] cp = 
{ 
    new File(file.getParent()).toURI().toURL() 
}; 
URLClassLoader urlcl = new URLClassLoader(cp); 
Class cls = urlcl.loadClass(file.getName().replaceAll("\\.class",""); 

如果类文件不包含封装,它的工作从初始类文件包。
但它是一个包,我得到一些错误,这样的:

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: Waktu (wrong name: Name_pack/time/MyClass) 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:760) 
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
at java.net.URLClassLoader.defineClass(URLClassLoader.java:455) 
at java.net.URLClassLoader.access$100(URLClassLoader.java:73) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:367) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:360) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 

我不知道怎么去包装。

所以,我想最初是这样的:

Class cls = urlcl.loadClass(Name_pack.time.MyClass); 

回答

1

如果你有,没有发行代码库,也不是类的预期包知识绝对路径,事情就变得复杂了。实际的全限定名称包含在类文件中,这就是类加载器拒绝它的原因;它甚至会告诉你异常消息中的实际名称,但是,不能保证异常消息将包含该信息。

因为我不假设你想开始解析字节码来找到实际的类名,所以我建议重新设计应用程序以在第一个接收类路径目录(代码库)和全限定类名地点。

一个简单的,但并不推荐使用,可能只是想它:

File file=new File("D:\\java\\myproject\\Name_pack\\time\\MyClass.class"); 
String className=file.getName(); 
if(!className.endsWith(".class")) 
    throw new IllegalArgumentException(file.toString()); 
className=className.substring(0, className.lastIndexOf('.')); 
File codeBase=file; 
Class cls = null; 
do { 
    codeBase=codeBase.getParentFile(); 
    URL[] cp = { codeBase.toURI().toURL() }; 
    URLClassLoader urlcl = new URLClassLoader(cp); 
    try { cls = urlcl.loadClass(className); } 
    catch(NoClassDefFoundError ex) { 
     className=codeBase.getName()+'.'+className; 
    } 
} while(cls==null); 

但正如所说,最好的选择是让,不管来源提供你的文件,提供正确的代码库目录第一名...