Java Can';找不到Class.forName()的类,但该类存在

Java Can';找不到Class.forName()的类,但该类存在,java,reflection,classloader,urlclassloader,Java,Reflection,Classloader,Urlclassloader,我有一个在运行时生成类的程序(只包括变量和相关的getter和setter方法)。以后我想补课 为了获取类-我知道它的名称,但它不在类路径中-我尝试了.forName(),但我总是得到一个ClassNotFoundException 以下是我的例子: Exception in thread "main" java.lang.ClassNotFoundException: com.test.wam.business.wsobjects.Testclass at java.net.URLClassL

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

这里出了什么问题?

该方法使用调用方类的
类加载器
,如果您想使用特定的
类加载器
来加载您需要使用的类,则作为下一步:

Class c = Class.forName(
    "com.test.wam.business.wsobjects.Testclass", true, dynamicURLClassLoader
);

NB:当且仅当您提供给
DynamicCurlClassLoader
URL
有效并且是指向您的类所在父文件夹的路径时,此操作才有效

1) 您正在创建一个
dynamiccurlclassloader
并将URL添加到其中,但实际上并没有使用它。本声明:

 Class c = Class.forName("com.test.wam.business.wsobjects.Testclass");
将使用加载当前类的类加载器。这可能是应用程序的默认类加载器,但它肯定不是您刚才创建的类加载器。报告说:

[
Class.forName(className)
]返回与具有给定字符串名称的类或接口关联的
Class
对象。调用此方法相当于:

Class.forName(className, true, currentLoader) 
其中
currentLoader
表示当前类的定义类装入器

所以。。。。解决办法是:

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的方式可能有效,但这不是正确的方式

参考:


“但它不在类路径中”。那.
Class.forName
需要
Class
文件,
Testclass.java
不是。在这种情况下我能做什么?我只有生成的java文件,没有类文件?仅仅创建
DynamicCurlClassLoader
什么都不做,
Class.forName(…)
不会自动使用该类加载器。当然,必须首先编译Java源代码