1

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

ここで同様の投稿を見つけましたが、この質問に直接対処するものはありません。 この投稿は、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();
    }
}
4

2 に答える 2

0

あなたが参照している投稿には、JCL ClassLoader フレームワークに関する回答があります - https://stackoverflow.com/a/1450837/982341を参照してください

そのフレームワークのドキュメントを見ると、ロードされたクラスのインスタンスの作成がサポートされており、それらを適切なオブジェクトにキャストするためのメソッドが提供されているため、リフレクションを使用する必要がないことがわかります。

于 2012-03-08T01:28:41.310 に答える