我遇到了一个非常奇怪的问题。
我正在使用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)
有什么问题吗?
c:\temp
中存在TestClass.class
吗?因为看起来你在该目录下有TestClass.java
而不是TestClass.class
,你还没有测试文件名是否以.class
字符串结尾。 - Vishal KString name = "TestClass"; Class.forName("TestClass", true, ucl).newInstance(); Class.forName(name, true, ucl).newInstance();
不要捕获异常 - 如果前面的代码没有抛出异常,我非常怀疑最后一行会抛出异常... - assylias