Java Can';找不到Class.forName()的类,但该类存在
我有一个在运行时生成类的程序(只包括变量和相关的getter和setter方法)。以后我想补课 为了获取类-我知道它的名称,但它不在类路径中-我尝试了.forName(),但我总是得到一个ClassNotFoundException 以下是我的例子: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
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源代码