我有一些问题如何从类文件初始化包从另一个目录
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);
如果您所拥有的只是一个绝对文件路径,而不了解代码库或期望的类包,事情就会变得复杂。实际的完整限定名包含在类文件中,这就是类装入器拒绝它的原因;它甚至在异常消息中告诉您实际的名称,但是,不能保证异常消息将包含该信息。
由于我不认为您希望开始解析字节码以找到实际的类名,因此我建议重新设计应用程序,以便首先分别接收类路径目录(代码库)和完全限定的类名。
一个简单但不推荐使用的方法是:
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);
但如前所述,最好的选择是让,无论源为您提供文件,首先提供正确的代码库目录…