【发布时间】:2013-02-17 11:49:07
【问题描述】:
我遇到了一个非常奇怪的问题。
我正在使用 URLClassLoader 从目录中动态导入文件。如果我使用文字字符串,代码可以正常工作,如果我将变量用于文字字符串,代码也可以正常工作,但这不是我需要的。
package test;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
public class Test {
public static void main(String[] args) {
try {
File subfolder = new File("C:\\temp\\");
URL classUrl = subfolder.toURI().toURL();
URL[] classUrls = { classUrl };
URLClassLoader ucl = new URLClassLoader(classUrls);
for (File f : subfolder.listFiles()) {
String name = f.getName()
.substring(0, f.getName().lastIndexOf(".")).trim();
if (name.equals("TestClass"))
System.out.println(name);
try {
MyInterface de = (MyInterface) Class.forName("TestClass", true, ucl)
.newInstance();
de.printSomething();
} catch (ClassNotFoundException e) {
}
ucl.close();
}
} catch (MalformedURLException e) {
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我需要的是能够做到这一点:
MyInterface de = (MyInterface) Class.forName(name, true, ucl).newInstance();
但即使“name”是一个有效的字符串并且等于“TestClass”,它也不起作用。
编辑:我得到错误:
java.lang.ClassNotFoundException: TestClass
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at test.Test.main(Test.java:25)
怎么了?
【问题讨论】:
-
当你说它对你有用时,它是如何工作的?您是否确保可以正确使用该类(即初始化并执行某些方法)?
-
我正在使用此处显示的示例:stackoverflow.com/questions/2786416/… 当我说它有效时,我的意思是上面编写的代码打印出“Hello World,来自 TestClass”,就像它应该的那样,但是使用ucl.loadClass(STRING) 或 Class.forName(STRING, true, ucl) 中的变量而不是文字字符串“TestClass”会引发异常。即使在上面的代码中 name.equals("TestClass") 是真的。它们完全一样。
-
您确定
TestClass.class存在于文件夹c:\temp中吗?因为看起来您在该目录中有TestClass.java而不是TestClass.class,因为您尚未测试文件名endswith.classString.. -
上面的代码确实可以完美运行,而且应该可以。绝对是 C:\temp 中的 TestClass.class
-
那么如果上面的代码完美运行,问题是什么?
标签: java string file-handling urlclassloader