我正在尝试加载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: noOsx in java.library.path atjava.lang.ClassLoader.loadLibrary (ClassLoader.java: 1886)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)在java.security.AccessController。特权(本地方法)在sun.security.krb5.SCDynamicStoreConfig SCDynamicStoreConfig.java: 39。. lang . class。forName0(本机方法)atjava.lang.Class.forName (Class.java: 190)com.myclass.getJARFromClassForName (JavaId.java: 510)getjarurl (Id.java:550com.myclass.collectInformation (Graph.java: 366)在com.myclass.createNode (Graph.java: 166)(图.java:143com.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()本身复制。
是真的吗?是否有一个原因,为什么这不能加载反射或我做错了什么?
"Cannot be caught",因为它是Error
,而不是Exception
。我建议检查Throwable
的JDK中的对象层次结构。
试着把它改成Throwable
,你会有更好的运气捕捉。我不知道为什么会发生错误。
这看起来像一个使用本机代码的JNI类。我不知道你在做什么,但我觉得这是个坏主意。
这不是这个类期望的加载方式,直接加载这个内部类似乎不起作用。您需要使用标准加密API加载类,以便该类可以按预期加载,或者可能根本不加载(它可能是仅在OSX上工作的代码)
从您提供的链接中可以看到,在某些类中此方法会失败。
当在这些对象上调用这个方法时,Java需要首先加载额外的东西,因为这是平台特定的东西,默认情况下没有附带。在您的示例中,它是Kerberos,一个安全API。正如您在它的文档中看到的,它在特定路径(java.library.path)中搜索一些文件。因为在那里找不到它,它抛出一个错误。
注意,错误UnsatisfiedLinkError并不是指查找sun.security.krb5.SCDynamicStoreConfig本身的类名。它指的是在java.library.path提供的路径中找不到本机库。例如在Windows上,该路径本身指向C:Windows/system32/。
catch(Error e)
中捕获此错误,请注意 error 不是Exception (Throwable层次结构)。请注意,捕获错误通常不是一个好主意,因为您无法确定JVM是否可以从中恢复。