Java Class.forName()不适用于特定的类
我试图用java反射加载一组类。一切似乎都很正常(如果找不到类,我将处理异常) 但是,有一个特定的类引发了另一个异常,该异常不是通过调用class.forname()引发的,而是通过内部方法引发的,因此我甚至无法捕获它 这是我的密码:Java Class.forName()不适用于特定的类,java,reflection,java.library.path,Java,Reflection,Java.library.path,我试图用java反射加载一组类。一切似乎都很正常(如果找不到类,我将处理异常) 但是,有一个特定的类引发了另一个异常,该异常不是通过调用class.forname()引发的,而是通过内部方法引发的,因此我甚至无法捕获它 这是我的密码: try { URL url = Class.forName(qualifiednameOfTheClass); } catch (ClassNotFoundException ex) { // ok class not found can be
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
}
因此,有了这段代码,一切都正常,我在很多类上使用它,而且它正常工作(有时发现,有时没有)
然而,有一个案例工作不正常,我无法理解原因。如果qualifiedNameofClass=sun.security.krb5.SCDynamicStoreConfig
我的代码引发异常:
线程“mythread-1”java.lang.UnsatifiedLink中出现异常错误:否
java.library.path中的osx位于
loadLibrary(ClassLoader.java:1886)位于
位于的java.lang.Runtime.loadLibrary0(Runtime.java:849)
java.lang.System.loadLibrary(System.java:1088)位于
运行(LoadLibraryAction.java:67)
在
运行(LoadLibraryAction.java:47)
位于java.security.AccessController.doPrivileged(本机方法)
sun.security.krb5.SCDynamicStoreConfig.(SCDynamicStoreConfig.java:39)
位于java.lang.Class.forName0(本机方法)
java.lang.Class.forName(Class.java:190)位于
getjarfromflassforname(JavaId.java:510)
位于com.myclass.getJARUrl(Id.java:550)
collectInformation(Graph.java:366)
在
com.myclass.createNode(Graph.java:166)
位于com.myclass.Graph.(Graph.java:143)
com.myclass2.run(myclass2.java:246)
运行(Thread.java:745)
因此,正如您在错误中看到的,我们有一个奇怪的异常,即使在我的代码中有一个通用的catch也无法捕获,我无法理解为什么会出现这个异常,以及这个osx库到底是什么(我在linux上)
编辑:我唯一发现的是这个链接,但它是德语的,所以我用google translate阅读了它,我不知道我是否正确,但我说这里列出的类不能用Class.forname()本身复制
这是真的吗?有什么原因不能加载反射或我做错了什么吗?“无法捕获”,因为这是一个错误,而不是异常。我建议查看JDK中的对象层次结构,查看Throwable
尝试将其更改为“可丢弃的”
,您的运气会更好。我不知道为什么会出错
这看起来像是一个使用本机代码的JNI类。我不知道你在做什么,但这对我来说似乎是个坏主意。这不是这个类希望加载的方式,直接加载这个内部类似乎不起作用。您需要使用标准加密API加载该类,以便该类可以按预期加载,或者根本不加载(可能是只在OSX上工作的代码)正如您在提供的链接中所看到的,有些类的此方法失败
在这些对象上调用此方法时,Java需要首先加载其他内容,因为这是默认情况下不提供的特定于平台的内容。在您的例子中,它是一种安全API。
正如您在its中看到的,它在特定路径(java.library.path)中搜索一些文件。由于在那里找不到,它会抛出一个错误。
请注意,错误UnsatifiedLinkError并不是指查找sun.security.krb5.SCDynamicStoreConfig本身的类名。它指的是在java.library.path提供的路径中找不到本机库。
例如,在Windows上,此路径本身指向C:Windows/system32/
但是,您可以使用catch(error e)
捕获此错误,请注意,错误不是异常()。
请注意,捕获错误通常不是一个好主意,因为您无法确定JVM是否可以从中恢复