java - 找不到带有 Class.forName() 的类,但它存在

标签 java reflection classloader urlclassloader

我有一个在运行时生成类的程序(仅包括变量和关联的 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 the Class 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/

相关文章:

java - Maven 模块组装/阴影构建

java - 图像像素替换

java - 解析 Java 中的类型是什么意思?

osgi - 在 Pax Exam 测试方法中使用匿名类时出现 ClassNotFoundException

Tomcat 6 为加载类添加特定于 webapp 的目录

java - 如何在 JFrame 中播放 mp4 视频文件?

java - 如何查看幸存者空间中的物体

java - 静态检查 Java 应用程序是否存在链接错误

c# - 通过反射在另一个 Controller 中调用 WebApi 的另一个 Action ?

java - java.lang.ClassLoader.loadClass 中的错误(未知来源)