2016-04-29 2 views
4

私のコードでリフレクションを使用する必要があるため、私のプログラムはすべての異なるバージョンで動作しません。クラスの新しいインスタンスを作成したいと思います。使用するコンストラクタには、クラスの配列が含まれています。しかし、そのクラスはまた、リフレクションを使って見つけなければなりません。これは私が現在持っているものの例です。コンストラクタは、そのクラスが、そのクラスの配列を使用していないので、どのように私はそれの配列型にこのクラスを回すでしょうしかし コンストラクタでリフレクションを使用するクラス配列

Constructor<?> constructor = getClass("className").getConstructor(getClass("anotherClass")); 

private Class<?> getClass(String name) { 
    return Class.forName("my.package." + version + "." + name); 
} 

答えて

6

The Java Virtual Machine specificationは、配列型のクラス名を指定します。あなたはそのような名前を構築し、Class#forNameを使用することができます。ただし、プリミティブ型と参照型では名前の論理が異なるため、これらの名前を生成するのは面倒なことがあります。

代わりに、指定された型のサイズ0の配列を作成し、その型をgetClass()で取得するために使用できます。

Class<?> componentType = Class.forName("java.lang.String"); 
Class<?> arrayType = java.lang.reflect.Array.newInstance(componentType, 0).getClass(); 
System.out.println(arrayType); 

例えば

は、次に所与のアレイタイプにClassオブジェクトを保持する

class [Ljava.lang.String; 

arrayTypeを印刷します。これを使用してコンストラクタを取得できます。

関連する問題