6
votes

Comment instancier une arraylist Et ajouter un article par réflexion avec Java?

J'écris une méthode de désérialisation qui convertit XML en un objet Java. Je voudrais le faire de manière dynamique et éviter d'écrire des références codées dures à des types spécifiques.

Par exemple, il s'agit d'une version simplifiée de l'une de mes classes. P>

MyObject obj = Serializer.fromXml("myxmldata", MyObject.class);


2 commentaires

Pouvez-vous également fournir un exemple du fichier XML?


Et si les sous-observations sont déclarées comme une interface (comme une liste)?


4 Réponses :


0
votes

dans les génériques Java ne sont que du sucre de syntaxe et n'existent pas en runtime. C'est pourquoi vous ne pouvez pas créer de manière programmatique d'objets génériques en exécution. Essayez de créer une liste non générique et de lancer (Cependant, je ne suis pas sûr car mon expérience est limitée avec GWT).


2 commentaires

Ce n'est pas tout à fait vrai. Si vous avez une classe myarray qui étendra l'arraylist , vous disposez des informations de type au moment de l'exécution. En outre, il est peut-être d'instancier un objet au moment de l'exécution que le code jette à un "objet paramétré" - la distribution ne sera pas de sens cependant et votre compilateur générera un avertissement à vérification de type.


@OXBOW: une classe stockera le type paramétré de ses signatures de méthodes à des roulements. Une collection individuelle ne croit pas.



0
votes

Vous devrez créer une liste STRY> STRY> CODE> code> (c'est-à-dire sans paramètres de type).

obj.setSubObjects(subs); //You'll get an "unchecked cast" warning at compile time


0 commentaires

10
votes

devrait être quelque chose de très proche de: xxx

espère que cela aide cela aide.


4 commentaires

Merci, c'est ce que je cherchais. Pouvez-vous également expliquer comment je pourrais obtenir les informations de type pour SubObject dans l'instance de liste?


C'est le bit qui n'est pas présent, les informations de type générique des collections ne sont pas disponibles au moment de l'exécution de Java. Les génériques sont implémentés dans le compilateur.


Je suppose que le bit que vous êtes après est comment savoir quelle classe instancier pour vous ajouter à votre nouvel objet de la liste? Cette information n'est tout simplement pas disponible, vous pouvez ajouter votre auto en créant une annotation et en annotant le champ SUBObjects avec elle, quelque chose comme @SerialisationType (SubObject.class)


Je l'ai trouvé. Si vous appelez (paramétréype) champ.gegenericteryType ())). ToString () Vous pouvez voir le nom complet du type qui inclut SubObject. J'ai ensuite saisi le nom de la classe et j'ai créé une nouvelle instance par classe.forname ("SubObject"). NewInstance (). Très hacky, mais ça marche.



3
votes

Il semble que le vrai problème ici va de XML aux objets Java. Si tel est le cas (et puisque vous êtes nouveau à Java), une meilleure solution que de rouler le vôtre peut être d'étudier les technologies existantes telles que:


0 commentaires