Créer dynamiquement un objet dans Java à partir d'un nom de classe et définir des champs de classe en utilisant une liste avec des données
J'ai une Liste qui contient des données avec la Chaîne de type -> ["classField1", "classField2", "classField3"]
J'ai une méthode (myMethod(List list, String className)
) qui accepte comme paramètre de la Liste. Donc, je peux transmettre cette Liste à l'aide du paramètre myMethod(Liste de liste de, String className).
Dans myMethod
je veux créer un objet, qui sera l'instance de la classe, qui est le deuxième paramètre. Après que j'ai envie de définir les champs de la classe en utilisant les données de la Liste.
En raison du fait que je veux obtenir dynamiquement les champs de la classe, la conséquence de ce qui précède, c'est que d'avoir à jeter chaque Chaîne de valeur de la liste, le type de chaque champ de la classe.
Je suis sûr que l'ordre des Chaînes à l'intérieur de la Liste, sont dans le bon ordre, et correspondent aux champs de la classe avec le même ordre.
N'quelqu'un a une idée de comment procéder à la ci-dessus?
Exemple:
["StringtempValue", "StringUnitOfMeasurement"]
=>
Créer une instance de l'objet:
public class TempStruct {
private double tempValue;
private String unitOfMeasurement;
public TempStruct(double tempValue, String unitOfMeasurement) {
this.tempValue = tempValue;
this.unitOfMeasurement = unitOfMeasurement;
}
}
J'essaie de donner une solution avec la manière suivante:
En fait, je veux créer un objet d'une classe existante et j'ai essayé de le faire avec la réflexion. J'utilise le code suivant:
Class<?> cls = Class.forName(name);
Object clsInstance = (Object) cls.newInstance();
Field[] objectFields = clsInstance.getClass().getDeclaredFields();
Mais j'obtiens une exception à la 2e ligne, lorsqu'il tente de créer le nouvel objet.
@JB Nijet dit que je ne savais pas que la méthode getDeclaredFields() ne retourne pas les champs de tri.
En fait, j'ai une méthode qui acceptent uniquement la Liste des Chaînes, donc par l'aide de la réflexion-je convertir l'objet à la Liste de chaîne de caractères, et après que j'ai envie de faire le contraire.
Je ne pense pas qu'aucune autre façon de le faire.
source d'informationauteur Georgios Bouloukakis
Vous devez vous connecter pour publier un commentaire.
Dynamique de l'instanciation d'objets peut être assez complexe, et que votre scénario touche à plusieurs aspects:
String
pour le type appropriéUne discussion approfondie de chacun de ces points serait prendre un chapitre entier dans un sans-doute de rivetage traitement de Java en tant que langage dynamique. Mais, en supposant que vous n'avez pas le temps d'apprendre ces subtilités, ou prendre une dépendance sur un grand tiers de la bibliothèque, nous allons concocter quelque chose qui vous met sur votre chemin. Merci de garder vos mains à l'intérieur du véhicule en tout temps que le trajet va devenir chaotique.
Nous allons aborder la question de la conversion de type premier. Les valeurs sont fournies à titre
Strings
mais votre objet va les stocker en tant quedouble
long
int
etc. Nous avons donc besoin d'une fonction qui analyse unString
dans le type de cible:Ugh. C'est laid et ne gère que des types intrinsèques. Mais nous ne sommes pas à la recherche de la perfection ici, non? Merci donc de renforcer appropriées. Note de la conversion de l'
String
à un autre type est effectivement une forme de la désérialisation, et vous êtes donc en imposant des contraintes sur vos clients (celui qui est en vous donnant laStrings
) pour fournir leurs valeurs dans des formats spécifiques. Dans ce cas, les formats sont définis par le comportement de l'parse
méthodes. Exercice 1: À un certain moment dans l'avenir, de changer le format d'un rétrocompatible façon d'engager quelqu'un en colère.Maintenant, nous allons faire l'instanciation:
Nous prenons beaucoup de raccourcis ici, mais bon ce n'est pas la chapelle sixtine, nous sommes en train de créer. Il suffit de charger la classe et à la recherche d'un constructeur dont le nombre de paramètres correspond au nombre d'arguments (c'est à dire, arité). Constructeurs surchargés de la même arité? Non, ne va pas marcher. Varargs? Non, ne va pas marcher. Non-public des constructeurs? Non, ne va pas marcher. Et si vous ne pouvez pas garantir votre classe va fournir un constructeur qui définit tous les champs comme votre exemple
TempStruct
ne le fait, alors je vais l'appeler un jour et prendre une bière, parce que cette approche est DOA.Une fois que nous trouvons le constructeur, en boucle sur la
String
arguments pour convertir les types attendus par le constructeur. En supposant que fonctionne, nous avons ensuite appeler le constructeur par la réflexion, la vague de la baguette magique et dire abracadabra. Voilà: vous avez un nouvel objet.Faites un essai avec une très artificiel exemple:
De sortie:
GLORIEUX
J'ai utilisé le même genre de problème et un hashMap s'est avéré être la solution pour moi.
Check it out:
http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html
Prendre un coup d'oeil à la http://commons.apache.org/beanutils/ paquet. Il permet d'accéder aux champs de nom.