0

私は現在、実行時にクラスを動的にロードするプログラムに取り組んでおり、それをサポートする関数のライブラリを構築しています。これらの関数の 1 つは、特定の jar ファイルで特定のクラス名を簡単に検索し、特定の初期化引数セットから新しいインスタンスを作成するメソッドです。

問題は引数です。クラス型のセットのクラスのコンストラクターを見つける方法は知っていますが、引数のリストを受け入れるコンストラクターを見つけようとするのは難しいです。私の最初の考えは、引数を反復処理してそれぞれを呼び出すgetClass()ことでしたが、一部のコンストラクターにとって有効な可能性がある null 引数についてはどうでしょうか?

与えられた引数のセットに対して正しいコンストラクタを見つける賢明な方法はありますか?

注: 標準 Java のみ。これは共同プロジェクトであるため、Java 派生言語とサードパーティ ライブラリは利用できません。

4

3 に答える 3

2

Reflection APIのチュートリアルは完了しましたか?? それはまさにあなたが望むもののための実装を持っています..

于 2012-10-09T11:08:44.953 に答える
1

Reflection API チュートリアルに合格すると、問題に対して単一のメソッドを使用できます

private final boolean checkConstructor(Class<?> type, Class<?>... parameterTypes)  {

        try {
             forName.getConstructor(parameterTypes);
             return true;
        }catch(NoSuchMethodException e) {

        }

        return false;
    }

覚えておかなければならないことは、順番paraemterTypesが重要です。

parametersTypes を知らないコンストラクターを呼び出す場合、sytiation に割り当てるべきではありません。コンストラクターで null を使用しないという同じ規則がコード スタイルに適用されます。

于 2012-10-09T11:26:19.503 に答える
0

getClass() は正しいアプローチです。アクセス可能なすべてのコンストラクターを反復処理し、コンストラクターとその引数の選択の精神に従って動作する最も具体的なコンストラクターを選択する必要があります。これには、コンストラクターが 0 個または 1 個以上見つかった場合の例外のスロー、メソッド シグネチャの決定のようなボックス化/ボックス化解除が含まれます。null のため、そのアルゴリズムをそのまま実装することはできませんが、可能な限り近づける必要があります。

于 2012-10-09T11:28:53.930 に答える