2016-06-29 7 views
2

私はクラスの束をJavaのリフレクションでロードしようとしています。すべてが正常に動作しているようです(クラスが見つからない場合は例外を処理しています)。Class.forName()が特定のクラスで動作していません

しかし、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 
} 

ので、このコードのすべては、私はクラスの多くにそれを使用しています働いているし、それが働いていると(時にはそれが時にはそれがない見つかっ):

は、ここに私のコードです。

しかし、正しく動作しないケースが1つあり、その理由を理解できません。私のコードは、例外を発生さqualifiednameOfTheClass = sun.security.krb5.SCDynamicStoreConfigの場合:エラーで見ることができるよう

Exception in thread "mythread-1" java.lang.UnsatisfiedLinkError: no osx in java.library.path at 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) at 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) at com.myclass.getJARFromClassForName(JavaId.java:510) at com.myclass.getJARUrl(Id.java:550) at com.myclass.collectInformation(Graph.java:366) at com.myclass.createNode(Graph.java:166) at com.myclass.Graph.(Graph.java:143) at com.myclass2.run(myclass2.java:246) at java.lang.Thread.run(Thread.java:745)

だから、私たちも、私のコードのように、一般的なキャッチでキャッチすることができない、それがされている理由を私は理解できないこの奇妙な例外を持っています何が実際にこのosxライブラリ(私はLinux上にあります)

EDIT:このリンクはhttp://www.straub.as/java/pocketapi/index7.htmlですがドイツ語ですので私はgoogle translateで読んでいますそれは正しいですが、そこにリストされているクラスはClass.forname()自体では再現できないと言っています。

本当ですか?これにリフレクションをロードできない理由があるのですか、何か間違っていますか?

答えて

1

リンクあなたが提供している、このメソッドが失敗するいくつかのクラスがあります。

これらのオブジェクトでこのメソッドを呼び出すとき、Javaは最初に追加のものを読み込む必要があります。これはデフォルトでは出荷されないプラットフォーム固有のものです。あなたのケースでは、Kerberos、セキュリティAPIです。 Documentationにあるように、特定のパス(java.library.path)内のいくつかのファイルを検索します。それが見つからないので、エラーを投げます。エラーないUnsatisfiedLinkErrorsun.security.krb5.SCDynamicStoreConfig自身のクラス名を見つけるを参照していないことを
注意。これは、java.library.pathによって提供されるパスでネイティブライブラリを見つけられないことを指します。
このパス自体は、たとえばのWindowsからのC:Windows/system32/になります。

ただし、エラー例外Throwable hierarchy)ではないことに注意し、catch(Error e)でこのエラーをキャッチすることがあります。 エラーをキャッチすることは、JVMがそれから回復できるかどうかわからないので、一般的には理想的ではありません。

3

Exceptionではなく、Errorであるため「キャッチできません」。私はThrowableのJDKのオブジェクト階層を見直すことをお勧めします。

これをThrowableに変更してみると、幸運を祈ることができます。なぜエラーが起きているのか分かりません。

これは、ネイティブコードを使用しているJNIクラスのようです。あなたがしていることは分かりませんが、これは私にとっては悪い考えです。

3

これは、このクラスがロードされる方法ではなく、この内部クラスを直接ロードすることは動作しないように見えます。このクラスを期待どおりにロードするか、まったくロードしないように標準の暗号化APIを使用してクラスをロードする必要があります(OSXでのみ動作するコード)

関連する問題