2010-11-29 24 views
0

Je me demandais s'il était possible de créer une instance à partir d'un type Java et de remplir une liste paramétrée?Création d'une instance à partir d'un type Java

J'ai un type UserDefinedType avec une variable membre List<AnotherUserDefinedType> list (ainsi que certains types primitifs)

utilisant la réflexion (pour traiter les annotations personnalisées) sur UserDefinedType Je suis en train de traiter uniquement les variables membres avec une annotation spécifique. Si une propriété particulière est définie sur l'annotation, cela signifie que c'est AnotherUserDefinedType par opposition à un type primitif, donc il est géré différemment. Dans ce cas, je devais faire exactement ce que j'ai fait avec UserDefinedType.

La mise en garde est que je dois créer une instance de AnotherUserDefinedType de Field.getGenericType(), et en quelque sorte les ajouter à un type de List<AnotherUserDefinedType> et paramétré appeler UserDefinedType.setAnotherUserDefinedType(List<AnotherUserDefinedType> list).

J'ai essayé de trouver des informations à ce sujet, mais je suis à la perte maintenant. Toute aide serait appréciée.

Répondre

0

Si le type de paramètre n'est pas lui-même un paramètre de type, et est une classe avec un constructeur par défaut sans argument, vous pouvez faire quelque chose comme ceci:

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" 
    } 
} 

Il est assez brut si, et dans ce case n'obtient rien que vous ne puissiez pas faire sans réflexion (en instanciant AnotherUserDefinedType directement). Peut-être que vous pouvez développer ce que votre objectif principal est à travers tout cela? Il y a peut-être une approche plus propre que nous pourrions suggérer.

Si la liste elle-même est paramétré avec un paramètre de type de classe:

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

alors cela est impossible. Le type ne sera pas disponible lors de l'exécution en raison de l'effacement du type.

Donc, fondamentalement, cela n'est possible que si le type est connu statiquement, et si le type est statiquement connu, vous n'avez probablement pas besoin de réflexion.

+0

Merci pour la réponse Mark. En fin de compte, il s'agit d'une implémentation d'un DAO pour traiter une source de données/réponse moins que commun. Fondamentalement, j'utilise des annotations pour marshall données à partir d'un tableau multidimensionnel de chaînes à notre modèle de domaine sans tous les passe-partout. L'annotation de champ définit une propriété dans la réponse qui correspond au type. Cela a le potentiel d'être un type défini par l'utilisateur dont les valeurs sont à l'intérieur du tableau multidimensionnel de chaînes de sorte que je recoupe de manière récursive et traite les annotations sur le type défini par l'utilisateur. – pertinky

+0

Il sera paramétré à ce stade. – pertinky