Class.forName(clazz.getName());抛出java.lang.ClassNotFoundException

Class.forName(clazz.getName());抛出java.lang.ClassNotFoundException,java,jar,classloader,Java,Jar,Classloader,我正在动态加载jar文件,在加载jar文件时,我将所有类对象保存到列表。加载所有JAR后,我执行下面的代码,它抛出一个java.lang.ClassNotFoundException,指向Class.forName(clazz.getName())。我不知道为什么java找不到这个类,尽管它已经被明确加载了,请有人解释一下 Class<?> clazz = listOfClasses.get(0); try { Class.forName(clazz.

我正在动态加载jar文件,在加载jar文件时,我将所有
对象保存到
列表
。加载所有JAR后,我执行下面的代码,它抛出一个
java.lang.ClassNotFoundException
,指向
Class.forName(clazz.getName())
。我不知道为什么java找不到这个类,尽管它已经被明确加载了,请有人解释一下

    Class<?> clazz = listOfClasses.get(0);
    try {
        Class.forName(clazz.getName());
    }
    catch(Exception e) {
        e.printStackTrace();
    }
classclazz=listOfClasses.get(0);
试一试{
Class.forName(clazz.getName());
}
捕获(例外e){
e、 printStackTrace();
}

Class.forName(String)
使用调用
Class.forName的代码的类加载器。听起来您可能是在另一个类加载器中动态加载类?

正如您所说,您是在动态加载类,很明显,它们位于不同于执行
类.forName的代码的类加载器中。在这种情况下,还需要将类加载器传递给
Class.forName

Class<?> clazz = listOfClasses.get(0);
try {
    Class.forName(clazz.getName(), true, clazz.getClassLoader());
} catch(Exception e) {
    e.printStackTrace();
}
classclazz=listOfClasses.get(0);
试一试{
Class.forName(clazz.getName(),true,clazz.getClassLoader());
}捕获(例外e){
e、 printStackTrace();
}

可以通过为
clazz
获取
ClassLoader
,然后调用
loadClass(String)
来测试这一点:
clazz.getClassLoader().loadClass(clazz.getName())
。如果这样做有效的话,这个答案很可能是正确的。谢谢,我仍然没有+1的名声,但那就是,谢谢,你在加载罐子吗?当然,类在不同的类装入器中。您可以在调用“forName”之前执行类似的操作:
Thread.currentThread().setContextClassLoader(clazz.getClassloader())
或者,您可以创建一个要设置的复合类加载器,就像这里的那样:谢谢,我仍然没有+1的名声,但事实上, thanks@Ozaren您可以接受问题的答案,以表明最能解决您问题的答案: