2017-04-04 6 views
0

オブジェクトのコンストラクタのシグネチャである文字列を外部ソースから受け取ります。クラス名とパラメータが含まれています。例えばJavaリフレクションを使用してオブジェクトを作成する

public class Foo { 
    public Foo(int x, int y, int z) { 
    // do something 
    } 
} 

public class Bar { 
    public Bar (int x, boolean bool) { 
    // do something 
    } 
} 

のは、私はこのような多くのクラスを持っている、と私は私が受け取る文字列(つまり、クラス名と偶然にが含まれている)に基づいて、これらのクラスからオブジェクトを作成したいとしましょう。これはできますか?

私はこのようなものを使用してクラスを取得することができます知っている:

String className = "myClass"; 
Class<?> myClass = Class.forName(className); 
//Constructor<?> ctor = myClass.getConstructor(); 
//Object object = ctor.newInstance(new Object[] { ctorArgument }); 

しかし、私はコンストラクターがありますどのように多くの偶然に、コンパイル時に、どの種類のわからない場合はどのように私はオブジェクトをインスタンス化することができますかれらは〜だろう?ところで、私がオブジェクトを作成したいクラスは、たぶん1つのコンストラクタしか利用できません。しかし、各クラスは、他のクラスと比較して異なるコンストラクタを持つ可能性があります。

+0

あなたはその後、取得するためにリフレクションを使用することができます:例 - その後convertStringToActualType()はそれが 'Boolean.valueOf(argStr)」などのブールフィールドの場合、たとえば...実際のパラメータに文字列値を変換する方法を知っている必要がありますコンストラクタの引数の数と型。しかし、ある時点で、渡す値を決定する必要があります。 –

+0

渡したい値は、受け取ったStringから解析されます。次のようになります。 "Foo(4,5,7 ) "または" Bar(1、true) "を選択します。 – Johnny

答えて

0

問題ありませんnewInstance()方法は、配列を受け取るので:

public T newInstance(Object ... initargs) 

だから、あなただけのすべての引数を含む配列を初期化し、このような

何か、それを渡す:

String[] argsAsString = readValuesFromString(data); 
Object[] args = new Object[argAsString.length()]; 
int i = 0; 
Class<?>[] paramTypes = ctor.getParameterTypes(); 
for (String argStr: argsAsString) { 
    args[i] = convertStringToActualType(argStr, paramTypes[i]); 
    i++; 
} 

ctor.newInstance(args); 

にあなたをクラスのgetConstructors()を呼び出して、正しい数の引数でコンストラクタを見つけようとする必要があります。これは、同じ数の引数を持つコンストラクタが2つ以上存在しない場合にのみ機能します。

Object convertStringToActualType(String arg, Class<?> type) { 
    if (type == String.class) 
     return arg; 
    if (type == Boolean.class) 
     return Boolean.valueOf(arg); 
    throw new IllegalArgumentException("type " + type.getSimpleName() + " not supported"); 
} 
+0

答えをありがとう。私は例として示したコードを完成させ、それを実行しようとしました。しかし、私が 'arguments [i] = convertStringToActualType(argStr、paramTypes [i]);'を実行しようとすると、次の 'スレッド内の例外 'メイン" java.lang.ArrayStoreException:java.lang.Boolean'を取得します。それは何か他のものを期待するように配列がブール値を格納できないようですね? – Johnny

+1

ここに問題があったようです。 'Object [] args = new String [argAsString.length()];'。 'Object [] args = new Object [argsAsString.length]; ' – Johnny

+0

はい、すみませんでした。一定 – paranoidAndroid

関連する問題