Class.forName()不适用于特定的类

时间:2016-06-29 09:03:16

标签: java reflection java.library.path

我正在尝试用java反射加载一堆类。一切似乎工作正常(如果找不到类,我正在处理异常)。

但是有一个特定的类正在引发另一个异常,它不是通过调用Class.forname()而是通过内部方法抛出的,因此我甚至无法捕获它。

这是我的代码:

try {
     URL url = Class.forName(qualifiednameOfTheClass);
} catch (ClassNotFoundException ex) {
     // ok class not found can be handled
} catch (Exception e){
     // catch every other exception just to try to get the strange exception
}

因此,使用此代码,一切正常,我在很多课程中使用它并且它正在工作(有时它发现它有时它不会)。

然而,有一个案例不能正常工作,我无法理解为什么。如果qualifiednameOfTheClass = sun.security.krb5.SCDynamicStoreConfig我的代码引发异常:

  

线程中的异常" mythread-1" java.lang.UnsatisfiedLinkError:没有   osx在java.library.path中   java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886)at   java.lang.Runtime.loadLibrary0(Runtime.java:849)at   java.lang.System.loadLibrary(System.java:1088)at   sun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:67)     在   sun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:47)     在java.security.AccessController.doPrivileged(Native Method)at   sun.security.krb5.SCDynamicStoreConfig。(SCDynamicStoreConfig.java:39)     at java.lang.Class.forName0(Native Method)at   java.lang.Class.forName(Class.java:190)at   com.myclass.getJARFromClassForName(JavaId.java:510)     在com.myclass.getJARUrl(Id.java:550)at   com.myclass.collectInformation(Graph.java:366)     在   com.myclass.createNode(Graph.java:166)     在com.myclass.Graph。(Graph.java:143)at   com.myclass2.run(myclass2.java:246)     在java.lang.Thread.run(Thread.java:745)

因此,您可以在错误中看到我们有这个奇怪的异常,即使使用像我的代码中的泛型捕获也无法捕获,我无法理解为什么它已被引发,实际上是什么是这个osx库(我在linux上)

编辑:我发现的唯一一件事就是这个链接http://www.straub.as/java/pocketapi/index7.html但是是德语,所以我用谷歌翻译阅读它,我不知道我是否做得对,但是说这些课程列出那里不能用Class.forname()本身复制。

这是真的吗?有没有理由为什么这不能反映或我做错了什么?

3 个答案:

答案 0 :(得分:3)

“无法抓住”因为它是Error,而不是Exception。我建议在JDK中查看Throwable的对象层次结构。

尝试将其更改为Throwable,您将获得更好的运气。我不知道为什么会发生错误。

这看起来像是使用本机代码的JNI类。我不知道你在做什么,但对我来说这看起来不错。

答案 1 :(得分:3)

这不是这个类期望加载的方式,直接加载这个内部类似乎不起作用。您需要使用标准加密API加载该类,以便可以按预期加载此类,或者可能根本不加载该类(它可能是仅适用于OSX的代码)

答案 2 :(得分:1)

正如您在所提供的链接中所看到的,有一些类会导致此方法失败。

在这些对象上调用此方法时,Java首先需要加载其他内容,因为这是特定于平台的内容,默认情况下不会发送。在您的情况下,它是 Kerberos ,一个安全API。 正如您在Documentation中看到的,它会搜索特定路径中的某些文件( java.library.path )。由于它无法在那里找到它,它会引发错误 请注意,错误 UnsatisfiedLinkError 并不是指查找 sun.security.krb5.SCDynamicStoreConfig 本身的类名。它指的是在 java.library.path 提供的路径中找不到本机库 此路径本身(例如在 Windows 上)指向 C:Windows / system32 /

但是,您可能会在catch(Error e)中发现此错误,请注意错误不是异常Throwable hierarchy)。 请注意,一般情况下捕获错误并不是一个好的理念,因为您无法确定JVM是否可以从中恢复。