【问题标题】:Class.forName(clazz.getName()); throw java.lang.ClassNotFoundExceptionClass.forName(clazz.getName());抛出 java.lang.ClassNotFoundException
【发布时间】:2016-05-02 13:49:06
【问题描述】:

我正在动态加载 jar 文件,在加载 jar 时,我将所有 Class 对象保存到 List。加载完所有 jar 之后,我执行下面的代码,它会抛出一个指向 Class.forName(clazz.getName())java.lang.ClassNotFoundException。我不确定为什么 java 无法找到该类,即使它已明确加载,请有人解释一下。

    Class<?> clazz = listOfClasses.get(0);
    try {
        Class.forName(clazz.getName());
    }
    catch(Exception e) {
        e.printStackTrace();
    }

【问题讨论】:

  • 你是如何加载 Jar 的?绝对类在不同的类加载器中。你可以在调用“forName”之前做这样的事情:Thread.currentThread().setContextClassLoader(clazz.getClassloader()) 或者,你可以创建一个要设置的复合类加载器,就像这里的那个:java2s.com/Code/Java/Language-Basics/…

标签: java jar classloader


【解决方案1】:

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

【讨论】:

  • 可以通过为clazz 获取ClassLoader 来测试这一点,然后像这样调用loadClass(String)clazz.getClassLoader().loadClass(clazz.getName())。如果可行,则此答案可能是正确的。
  • 谢谢,我仍然没有 +1 的声誉,但就是这样,谢谢
【解决方案2】:

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

Class<?> clazz = listOfClasses.get(0);
try {
    Class.forName(clazz.getName(), true, clazz.getClassLoader());
} catch(Exception e) {
    e.printStackTrace();
}

【讨论】:

猜你喜欢
  • 2014-04-21
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-14
相关资源
最近更新 更多