Java类加载器问题:jar中只有类的子集可用

时间:2015-08-20 13:36:07

标签: java classloader

我在使用类加载器按名称加载类时遇到了一些非常奇怪的问题。这个类是从类路径上的第三方jar中提取的。但是,尝试实例化该类失败,并在以下行中出现ClassNotFoundException:

String className = "...";
myInstance = Class.forName(className).newInstance();

我也试过三种不同的类加载器:

classLoader = this.getClass().getClassLoader(); // or 
classLoader = Thread.currentThread().getContextClassLoader(); // or
classLoader = ClassLoader.getSystemClassLoader();

myInstance = (IPackageWriter)Class.forName(className, true, classLoader).newInstance(); 
但是,这些都不起作用。我检查了"类"属性,我确实看到了Jar中的一些类,但不是全部。我试图实例化的那个似乎不见了。

我之前从未遇到类似这样的事情。有谁知道为什么只有Jar中的类的子集可能在类加载器中可用?或者我如何进一步调试此问题的任何想法? 非常感谢。

干杯,

马丁

1 个答案:

答案 0 :(得分:0)

如果没有看到正在加载的类和jar文件,很难说出你的问题是什么。不过,以下是您可能尝试解决问题的一些事项:

  1. 检查您的.jar文件是否已损坏。尝试解压缩并确保类文件位于正确的路径中。
  2. 尝试加载没有反射的文件,即尝试直接在代码中实例化它,看它是否失败。
  3. 如果上一步成功调用

    CodeSource src = MyClass.class.getProtectionDomain().getCodeSource().getLocation();
    System.out.println(src);
    

    找出实际装载的jar。该类可能是从不同的jar中加载的。