2010-11-29 7 views
0

Ich frage mich, ob es möglich ist, eine Instanz von einem Java-Typ zu erstellen und eine parametrisierte Liste zu füllen?Erstellen einer Instanz von einem Java-Typ

ich einen Typen UserDefinedType mit einer Membervariable List<AnotherUserDefinedType> list (sowie einige primitiven Typen) habe

Mit Reflexion (um benutzerdefinierte Anmerkungen zu verarbeiten) auf UserDefinedType ich mit einer bestimmten Annotation nur Membervariablen bin verarbeiten. Wenn eine bestimmte Eigenschaft für die Annotation festgelegt ist, bedeutet dies, dass es AnotherUserDefinedType im Gegensatz zu einem primitiven Typ ist, so dass es anders gehandhabt wird. In diesem Fall sollte ich genau das tun, was ich mit UserDefinedType gemacht habe.

Der Nachteil ist, ich habe eine Instanz von AnotherUserDefinedType von Field.getGenericType(), erstellen und sie irgendwie auf eine parametrierten Art von List<AnotherUserDefinedType> hinzufügen und UserDefinedType.setAnotherUserDefinedType(List<AnotherUserDefinedType> list) nennen.

Ich habe versucht, einige Informationen darüber zu finden, aber bin jetzt ratlos. Jede Hilfe wäre willkommen.

Antwort

0

Wenn der Parametertyp ist kein Typ-Parameter selbst und ist eine Klasse mit einem Standard-Konstruktor ohne Argumente, können Sie etwas zu tun:

public class UserDefinedType { 
    private List<AnotherUserDefinedType> data; 

    public static void main(String[] args) throws Exception { 
     UserDefinedType inst = new UserDefinedType(); 
     ParameterizedType type = (ParameterizedType) UserDefinedType.class.getDeclaredField("data").getGenericType(); 
     Class<?> clazz = (Class<?>) type.getActualTypeArguments()[0]; 
     Object obj = clazz.newInstance(); //this is of type "AnotherUserDefinedType" 
    } 
} 

Es ist zwar ziemlich gross, und in diesem Fall erreicht nichts, was Sie ohne Reflexion nicht tun könnten (durch Instanziieren AnotherUserDefinedType direkt). Vielleicht können Sie das, was Ihr Hauptziel ist, durch all das erweitern? Vielleicht gibt es einen saubereren Ansatz, den wir vorschlagen könnten.

Wenn die Liste selbst mit einem Klasse-Typ Parameter parametriert:

public class UserDefinedType<T> { 
    private List<T> data; 
    //... 
} 

dann ist dies unmöglich. Der Typ wird zur Laufzeit aufgrund von Typlöschung nicht verfügbar sein.

Also grundsätzlich nur möglich, wenn der Typ statisch bekannt ist, und wenn der Typ statisch bekannt ist, brauchen Sie wahrscheinlich keine Reflexion.

+0

Danke für die Antwort Mark. Letztendlich handelt es sich um eine Implementierung eines DAO, um mit einer weniger als üblichen Datenquelle/Antwort umzugehen. Im Grunde benutze ich Annotationen, um Daten von einem mehrdimensionalen Array von Strings zu unserem Domain-Modell ohne all das Boilerplate zu marshallen. Die Feldannotation definiert eine Eigenschaft in der Antwort, die dem Typ zugeordnet ist. Dies kann ein benutzerdefinierter Typ sein, dessen Werte innerhalb des mehrdimensionalen Arrays von Strings liegen, so dass ich die Annotationen für den benutzerdefinierten Typ rekursiv aufreiße und verarbeite. – pertinky

+0

Es wird an dieser Stelle parametriert. – pertinky