2012-03-07 2 views
1

私は、現在のOS用のプラットフォーム依存ライブラリjarを動的にロードする方法を見つけようとしています。私は、JNI呼び出しを使用する第三者のライブラリにアクセスする必要があり、MacとWindowsでは異なるJarファイルを持っています。 2つのライブラリの呼び出しと戻りはすべて同じですが、コンパイル後にlibディレクトリのjarファイルを単に交換するだけですが、実行時にどのjarをロードするかをアプリケーションが判断できるようにしたいと考えています。OSに応じて動的にjarをロード

私はここに同様の記事を見つけましたが、この質問に直接対処するものはありません。 this postはClassLoaderを介して動的にjarファイルをロードする方法を示していますが、私が収集した内容から、Method method = clazz.getDeclaredMethod("methodName")method.invoke()というアプローチを使用して、そのクラスが提供するメソッドを呼び出す必要があります。クラスローダー(これは私が避けたいものです)。

私はのようになります解決策を見つけることを願っています:

import external.lib.namespace.LibClassA; 
import external.lib.namespace.LibClassB; 

public class MyClass { 
    static { 
     if (System.getProperty("os.name").contains("Windows") { 
      ClassLoader.getSystemClassLoader().load("Lib_win.jar"); 
     } else { 
      ClassLoader.getSystemClassLoader().load("Lib_mac.jar"); 
     } 
    } 

    public static void Main(String[] args) { 
     LibClassA.platformDependantCall(); 
     LibClassB.someOtherCall(); 
    } 
} 
+0

両方のジャーがクラスパスにある場合はどうなりますか? –

+0

@ MarkRobinson - 私はJava ClassLoaderの仕組みについて熟練していませんが、私の経験上、jarに別のjarやJava APIと同じ名前空間と名前を持つクラスが含まれている場合、ClassLoaderは、 。おそらく、ロードする方法を決定するために使用されるいくつかの方法がありますが、これは関係なくこの状況で役立ちません。私がこれについて間違っていて、誰かがさらに説明したいのであれば、してください。ありがとう。 – IgnisFatuus

答えて

0

あなたはを参照してくださいポストはJCLクラスローダフレームワークについての答えを持っている - あなたが見ればhttps://stackoverflow.com/a/1450837/982341

を見ますそのフレームワークのドキュメントでは、ロードされたクラスのインスタンスの作成をサポートし、適切なオブジェクトにキャストするためのメソッドを提供するので、リフレクションを使用する必要はありません。

+0

応答GreyBeardedGeekを指摘してくれてありがとう。私はそれを逃した。私はJCLフレームワークを調べて、それが私が望んでいることができるかどうかを見ていきます。 – IgnisFatuus

+0

私の本当の目標は、このライブラリが提供するクラスを使用してすでに書いたコードを変更することなく、実行時にロードするjarを動的に決定できるようにすることです。これは以下を意味します。 1.解決策はリフレクションを使用できません。 2.(暗黙のうちに1)コンパイル時にクラス定義を使用できるようにする必要があります。 ここで本当の答えは「できません」ということです。 – IgnisFatuus

+0

JCLフレームワークによって提供されるキャスト機能は、ライブラリからロードされた実際のクラスではなく、既知のクラスまたはインターフェイスにキャストできるように見えます。私が間違っている? – IgnisFatuus

0
System.getProperty("os.name") 

は、毎回OSに関する情報を取得するために使用することはできません。 JVMを呼び出すユーザーに必要なセキュリティ権限がない場合、SecurityException例外が発生して失敗します。

関連する問題