2016-04-05 2 views
2

Ich versuche, ein Objekt außerhalb der Klasse zu erstellen (via Java - Reflexion) - Benutzer wählen Sie einen Konstruktor und ich muss Variablen für diesen Konstruktor lesen (es sollte einige der sein primitive Typen).
Wie Sie jetzt sehen können, funktioniert mein Code nur für ganzzahlige Parameter.Get Argumente Typen von Constructor Objekt (Java Reflection)

Wie kann ich dynamisch den Typ des aktuellen Arguments herausfinden und es von der Tastatur lesen?

public static Object chooseConstr(Class cls) throws IllegalAccessException, InstantiationException, InvocationTargetException { 
    Scanner keyboard = new Scanner(System.in); 

    Constructor[] constructors = cls.getDeclaredConstructors(); 
    System.out.println("Choose constructor from the list: "); 
    System.out.println(Arrays.toString(constructors)); 

    int constr = keyboard.nextInt(); 
    constr--; 


    Object[] arguments=new Object[constructors[constr].getParameterCount()]; 

    for(int i=0; i<arguments.length; i++){ 
     System.out.println("Write argument #"+(i+1)); 
     arguments[i]=keyboard.nextInt(); 
    } 


    Object object = constructors[constr].newInstance(arguments); 

    System.out.println("Object created!"); 
    return object; 
} 

Antwort

0

Dies wird knifflig sein. Natürlich hat der Scanner einige grundlegende Methoden zum Lesen in einigen Typen, aber wenn Sie andere Arten von Argumenten lesen möchten, müssen Sie eine Möglichkeit finden, sie selbst zu lesen.

Hierfür können Sie Constructor.getParameterTypes() verwenden:

... 
Object[] arguments = new Object[constructors[constr].getParameterCount()]; 

Class<?>[] pTypes = constructors[constr].getParameterTypes(); 

for (int i = 0; i < arguments.length; i++) { 
    System.out.println("Write argument #" + (i + 1) + ". Of type: "+pTypes[i].getName()); 

    if(pTypes[i].equals(int.class)) {    
     arguments[i] = keyboard.nextInt(); // read an int 
    } else if(pTypes[i].equals(String.class)) { 
     arguments[i] = keyboard.next(); // read a String 
    } else { 
     // custom read code for other types 
    } 
} 
... 

Beachten Sie, dass die oben nicht abgeschlossen ist, hat Scanner mehrere Verfahren andere Arten zu lesen, die ich hier nicht zeigte.

Die beste Strategie zum Lesen anderer Arten von Argumenten ist wahrscheinlich, sie als String zu lesen und sie durch eine Factory-Methode in die entsprechenden Objekte zu konvertieren.

+0

Ich habe gerade festgestellt, dass Sie es nur für Primitive benötigen, also sollte dies einfacher sein als ich sagte. Beachten Sie, dass es auch für andere Typen funktionieren kann. –