2

2 つのクラスがAありB、1 つの引数のコンストラクターと 2 項関数fがある場合、次の形式の文字列を解析する必要があります。

"f(A(10), B(20))"
"f(A(2), A(3))"

適切なインスタンスを作成し、それぞれの関数を呼び出します。

class Functions {
    public static double f(A a1, A a2);
    public static double f(A a, B b);
    public static double f(B b1, B b2);
    // ...
}

だから私が探しているのは、そのような方法です

T createInstanceFromString(String desc);

「A(10)」や「B(20)」などの文字列からインスタンスを作成します。もちろん、残念なことに、これは Java では不可能です。

この問題の解決策に関するアドバイスは大歓迎です。

編集:潜在的に多数の異なるクラス、、、などと多数の関数、などがあることに言及するのを忘れていましたAB解析Cf呼び出しを分離するgために使用したいと思います。そうでない場合は、条件付きで個別に解析する必要がありますcreateInstanceFromString関数呼び出しごとに、多くのコードの重複が発生します。

Edit2 :問題は解析方法ではなく、汎用メソッド/ファクトリ/その他でインスタンスを解析して返す方法についてです。

4

3 に答える 3

2

文字列をトークン化する必要があります。(常にで始まり、f(で終わる)場合は、生活を楽にすることができます。これらの部分を削除してください)。

A(4) -> クラス名を検索 -> A -> パラメータを検索 -> 4

これは次のように行われます (疑似 Java コード):

public static Object createClass(String className, Double value){
    Class a = Class.forName(className);
    Class[] params = new Class[]{Integer.class};
    Constructor c = a.getConstructor(params);
    Object[] values = new Object[]{value};
    return c.newInstance();
}

たぶん、この lik が役に立ちます: http://docs.oracle.com/javase/tutorial/reflect/member/ctorInstance.html

update これはコンパイラを書くようなものです。コンパイラの書き方について何か読んだら、さらに詳しい情報を得ることができます: http://en.wikipedia.org/wiki/Compiler

update 2 は、生成されたすべてのインスタンスを配列に入れます。これで、reflections-API を使用して正しいメソッド f を取得できます。コードは次のようになります

http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getDeclaredMethod(java.lang.String , java.lang.Class...)

Object[] values ...
Class[] classes ...
for(Object o: values){
    add o.getClass() to classes
}

Method f = Functions.getClass().getDeclaredMethods("f", classes);
f.invoke(values);
于 2013-01-12T22:34:13.140 に答える
0

関数ごとにクラスを作って、「compute」などの静的メソッドを呼び出すとよいと思います。このようにして、文字列からクラス名と属性を解析し、クラス ローダーを介して適切なクラスをロードします。名前をキーとして、変数を値として含む HashMap を使用して、配列または変数を介して可変量のパラメーターを渡すことができます。

于 2013-01-12T22:18:07.527 に答える
0

試したことはありませんが、クラスを取得できるようです

Class clazz = Class.forName("NameOfTheWantedClass");

そしてより

Constructor[] constructors = clazz.getConstructors();

を使用して、必要なコンストラクターを検索するよりも

getParameterTypes() 

各コンストラクターで、必要なものを選択します。

Class.forName("NameOfTheWantedClass")しかし、私はあなたのアプローチを変えることを考えることをお勧めしますreflection。また、本当に必要な場合にのみ使用してください。

于 2013-01-12T22:22:26.617 に答える