2016-11-15 5 views
1

Ich versuche, einen Objekt-Ersteller zu erstellen, der den Benutzer zur Eingabe auffordert und dann ein Objekt erstellt. Ich habe ein Array von Konstruktoren für eine bestimmte Klasse, mit diesen Konstruktoren lasse ich den Benutzer eine auswählen und wenn dieser Konstruktor Parameter hat, möchte ich, dass der Benutzer diese Parameter im Flug setzt.Erstellen primitiver Typen/Objekte mit Java Reflection

Mit der Konstruktorliste von java.lang.reflect.Constructor; unten angegeben:

constructorList[0].getGenericParameterTypes()[0] 

Das eine Reihe von ‚Typ‘

Ist es möglich, gibt eine Instanz dieses Typs einen Wert durch den Benutzer gegeben zu schaffen? Sage sein einen int-Typ, wenn ich das int wollte 10 sein - (ich diese nicht funktionieren weiß aber theoretisch)

constructorList[0].getGenericParameterTypes()[0] intValue = 10; 

Wenn seine Aufgabe, ich die Klasse von Typ bekommen und ... Ich denke, Ich kann einen rekursiven Aufruf an den Objektcreator machen, den ich mache, wäre es eine einfache Möglichkeit, eine neue Instanz dieses Objekts zu erstellen, weil ich das Gefühl habe, dass dies in eine endlose Rekursionsschleife gehen kann.

Antwort

1

Im Allgemeinen sehe ich keine grundlegenden Probleme mit Primitiven. Man sollte jedoch berücksichtigen, dass Type eine sehr abstrakte Deklaration ist, also nicht nur konkrete Klassen enthält, sondern auch solche wie Parametervariablen, parametrisierte Typen usw. Ich denke, es ist nützlich, sich daran zu erinnern, dass Primitive sehr spezifische Typen sind (Klassen), und sie sind nicht explizit konstruiert (da sie buchstäblich im Code deklariert sind, werden sie im Speicher nach Wert behandelt); also denke ich, ihre "boxed" Versionen werden stattdessen verwendet.

Sie sollten zwar in Betracht ziehen, dass Typüberprüfungen nicht angewendet werden, Sie müssen also manuell sicherstellen, dass alle Eingaben gültig sind und die Methodenergebnisse richtig umgesetzt werden.

Hier ist ein Beispielcode, mit dem Sie können inspirieren:

public static void main(String[] args) { 

    Scanner s = new Scanner(System.in); 
    String typeName = s.next(); 

    //ask for type 

    Class<?> type; 

    try { 
     type = Class.forName(typeName); 
    } catch (ClassNotFoundException e) { 
     System.out.printf("Class `%s` was not found%n", typeName); 
     return; 
    } 

    //discover constructors 

    Constructor<?>[] constructors = type.getConstructors(); 

    for (int i = 0; i < constructors.length; ++i) { 
     System.out.printf(" > %d %s%n", i, constructors[i]); 
    } 

    //select constructor and list its parameters 

    int constructorIndex = s.nextInt(); 
    Constructor<?> constructor = constructors[constructorIndex]; 

    Type[] parameterTypes = constructor.getGenericParameterTypes(); 
    for (Type parameterType : parameterTypes) { 
     System.out.println(parameterType); 

     //each type implementation requires a specific processing 

     if (parameterType instanceof Class) { 
      Class parameterClass = (Class) parameterType; 
      if ((parameterClass).isPrimitive()) { 

       //simple int primitive; which can be directly obtained from scanner 

       if (Integer.TYPE.isAssignableFrom(parameterClass)) { 
        System.out.println("\tinteger primitive > "); 
        int value = s.nextInt(); 
        System.out.println("\t you've entered " + value); 
       } 
      } else { 
       Stream.of((parameterClass).getConstructors()).forEach(c -> System.out.printf("\t%s%n", c)); 
       Stream.of((parameterClass).getDeclaredConstructors()).forEach(c -> System.out.printf("\t%s%n", c)); 
      } 
     } 
    } 

    // here we consider a sample java.lang.Integer class was requested with #0 constructor 

    if (Integer.class.isAssignableFrom(type) && constructorIndex == 0) { 

     System.out.println("Input an integer number: "); 

     String value = s.next(); 

     // since newInstance requires array of objects, we need to create an object (not primitive) 

     Object instance; 

     try { 
      instance = constructor.newInstance(Integer.valueOf(value)); 
     } catch (InstantiationException | InvocationTargetException | IllegalAccessException e) { 
      e.printStackTrace(); 
      return; 
     } 

     System.out.printf("%s %s%n", instance.getClass(), instance); 
    } 
}