2012-07-01 8 views
0

Я пытаюсь создать коллекцию объектов с использованием отражения. У меня есть имя класса. Но во время компиляции понятия не имеют о конструкторе. Я использовал этот учебник.Создание объекта из java-отражения без знания параметров конструктора

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); 
    } 
    } 

}

Теперь, скажем, я не знаю, примыкает параметры конструкторов. (Является ли это конструктором по умолчанию или двумя целыми числами). Параметры бизнес-структур могут меняться от класса к классу. Я понятия не имею о классе 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); 

      } 

Это будет работать для costrcutors, которые будут иметь Sprite или двойные параметры. Чтобы включить другие возможности, мне пришлось бы создать цепочку loooong if else. Нужна помощь.

+2

Но зачем вам это нужно в первую очередь? –

+0

Вот почему вы избегаете отражения и находите решение _better ._ –

ответ

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); 
} 

Конечно, я ожидал бы, что это провалится довольно часто. В конце концов, если вы ничего не знаете о конструкторе, который вы вызываете, вы не знаете, какие аргументы будут действительными.

Действительно ли это действительно что-то, что вы ожидаете найти полезным?

+0

Это было необходимо для создания объектов любого класса в серии связанных классов. Этот метод конструктора был тщетным. Поэтому я использовал другой метод из класса ObjectOutPutStream, который вместо этого создал объект любого класса. –