我有一个在运行时生成类的程序(仅包括变量和关联的 getter 和 setter 方法)。以后我想补课。
要获取类 - 我知道它的名称,但它不在类路径中 - 我尝试了 .forName() 但我总是得到 ClassNotFoundException。
这是我的例子:
Exception in thread "main" java.lang.ClassNotFoundException: com.test.wam.business.wsobjects.Testclass
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at gui.Application.main(Application.java:94)
代码:
URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
DynamicURLClassLoader dynamicURLClassLoader = new DynamicURLClassLoader(urlClassLoader);
dynamicURLClassLoader.addURL(new URL("file://C:\\dev\\Eclipse_was\\guitest\\generated"));
Class c = Class.forName("com.test.wam.business.wsobjects.Testclass");
Object classInstance = c.newInstance();
类加载器:
public class DynamicURLClassLoader extends URLClassLoader {
public DynamicURLClassLoader(URLClassLoader classLoader) {
super(classLoader.getURLs());
}
@Override
public void addURL(URL url) {
super.addURL(url);
}
文件的完整限定名称(使用 eclipse 创建 -> 复制完整限定名称)
/guitest/generated/com/test/wam/business/wsobjects/Testclass.java
这里有什么问题吗?
最佳答案
我可以看到两个问题:
1) 您正在创建一个 DynamicURLClassLoader
并向其添加 URL,但实际上并未使用它。这个声明:
Class c = Class.forName("com.test.wam.business.wsobjects.Testclass");
将使用加载当前类的类加载器。这可能是应用程序的默认类加载器,但它肯定不是您刚刚创建的类加载器。 javadoc说:
[
Class.forName(className)
] returns theClass
object associated with the class or interface with the given string name. Invoking this method is equivalent to:Class.forName(className, true, currentLoader)
where
currentLoader
denotes the defining class loader of the current class.
所以....解决方案是:
Class c = Class.forName("com.test.wam.business.wsobjects.Testclass",
true, dynamicURLClassLoader);
2) 这个字符串:
"file://C:\\dev\\Eclipse_was\\guitest\\generated"
不是有效的“文件:”URL。您尝试引用的路径的正确 URL 是:
"file:///C:/dev/Eclipse_was/guitest/generated"
您编写 URL 的方式可能可行,但这不是正确的方式。
引用:
关于java - 找不到带有 Class.forName() 的类,但它存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39634730/