Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Class.forName()不适用于特定的类_Java_Reflection_Java.library.path - Fatal编程技术网

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

我试图用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
}
因此,有了这段代码,一切都正常,我在很多类上使用它,而且它正常工作(有时发现,有时没有)

然而,有一个案例工作不正常,我无法理解原因。如果
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是否可以从中恢复