2

我正在尝试使用 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:java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886) 处的 java.library.path 中没有 osx 在 java.lang.Runtime.loadLibrary0(Runtime.java: 849) 在 java.lang.System.loadLibrary(System.java:1088) 在 sun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:67) 在 sun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:47) ) at 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) 在 com.myclass.getJARFromClassForName(JavaId.java:510) 在 com.myclass.getJARUrl(Id.java:550) 在 com.myclass.collectInformation(Graph.java:366) 在 com.myclass。创建节点(图。java:166) 在 com.myclass.Graph.(Graph.java:143) 在 com.myclass2.run(myclass2.java:246) 在 java.lang.Thread.run(Thread.java:745)

因此,正如您在错误中看到的那样,我们有这个奇怪的异常,即使在我的代码中使用通用的 catch 也无法捕获它,我无法理解为什么会引发它以及这个 osx 库实际上是什么(我在 linux 上)

编辑:我唯一找到的是这个链接http://www.straub.as/java/pocketapi/index7.html但它是德语的,所以我用谷歌翻译阅读它,我不知道我是否明白了对,但是说那里列出的类不能用 Class.forname() 本身复制。

这是真的吗?有没有理由不能加载反射或者我做错了什么?

4

3 回答 3

3

“不能被抓住”,因为它是一个Error,而不是一个Exception。我建议查看 JDK 中的对象层次结构以了解Throwable.

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

这看起来像一个使用本机代码的 JNI 类。我不知道你在做什么,但这对我来说似乎是个坏主意。

于 2016-06-29T09:07:14.060 回答
3

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

于 2016-06-29T09:07:26.707 回答
1

正如您在提供的链接中看到的那样,有一些类此方法失败。

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

但是,您可以使用 捕获此错误catch(Error e),请注意错误不是异常Throwable 层次结构)。请注意,通常捕获错误并不是一个好主意,因为您无法确定 JVM 是否可以从中恢复。

于 2016-06-29T09:25:34.893 回答