1

リフレクションを使用してオブジェクトのコレクションを作成しようとしています。私はクラス名を持っています。しかし、コンパイル時にはコンストラクターについてはわかりません。このチュートリアルを使用しました。

import java.lang.reflect.*;

  public class constructor2 {
      public constructor2()
      {
      }

  public constructor2(int a, int b)
  {
     System.out.println(
       "a = " + a + " b = " + b);
  }

  public static void main(String args[])
  {
     try {
       Class cls = Class.forName("constructor2");
       Class partypes[] = new Class[2];
        partypes[0] = Integer.TYPE;
        partypes[1] = Integer.TYPE;
        Constructor ct 
          = cls.getConstructor(partypes);
        Object arglist[] = new Object[2];
        arglist[0] = new Integer(37);
        arglist[1] = new Integer(47);
        Object retobj = ct.newInstance(arglist);
     }
     catch (Throwable e) {
        System.err.println(e);
     }
  }

}

ここで、コンストラクターのパラメーターについて知らないとしましょう。(それがデフォルトのコンストラクターであるか、2 つの整数であるかに関係なく)。コンストラクターのパラメーターは、クラスごとに変更できます。Constructor2 クラスについてはわかりません。しかし、私はクラス名を持っています。したがって、上記のように「argList」を作成できません。コンストラクターからオブジェクトを作成する方法を考えてください。

私は次のようにしました

Constructor[] brickConstructorsArray = brickClass.getConstructors();
            for (Constructor constructor : brickConstructorsArray) {
                Class[] constructorParams = constructor.getParameterTypes();

                Object argList[] = new Object[constructorParams.length];
                int index = 0;
                for (Class cls : constructorParams) {

                    if (cls.equals(Sprite.class)) {
                        Object spriteOb = foundSprite;
                        argList[index] = spriteOb;
                    } else if (cls.equals(double.class)) {
                        Object dblObj = new Double(0.0);
                        argList[index] = dblObj;
                    }

                    index++;
                }
                brickObject = (Brick) constructor.newInstance(argList);

            }

これは、Sprite または double パラメーターを持つ costrcutor で機能します。他の可能性を含めるには、loooong if else チェーンを作成する必要があります。助けが必要。

4

1 に答える 1

3

どんな値を渡そうとしているか本当に気にしませんか? 各プリミティブ クラスからそのラッパー タイプのデフォルト値へのマップを作成できます。

// You can make this a static member somewhere
Map<Class<?>, Object> primitiveValues = new HashMap<Class<?>, Object>();
primitiveValues.put(char.class, '\0');
// etc

...そしてnull、非プリミティブ型に使用します。そう:

Constructor[] brickConstructorsArray = brickClass.getConstructors();
for (Constructor constructor : brickConstructorsArray) {
    Class[] constructorParams = constructor.getParameterTypes();

    Object argList[] = new Object[constructorParams.length];

    // When you need the index, there's no point in using the enhanced
    // for loop.
    for (int i = 0; i < constructorParams.length; i++) {
        // Fetching the value for any non-primitive type will 
        // give null, which is what we were going to use anyway.
        argList[i] = primitiveValues.get(constructorParams[i]);
    }

    brickObject = (Brick) constructor.newInstance(argList);
}

もちろん、これはかなり頻繁に失敗すると思います。結局のところ、呼び出しているコンストラクターについて何も知らなければ、どの引数が有効になるかわかりません。

これは本当にあなたが役に立つと期待しているものですか?

于 2012-07-01T07:10:35.210 に答える