J'essaie de configurer un petit métamodèle afin de référencer certaines propriétés sur plusieurs classes.Gestion de la méta de la classe (référence aux propriétés)
Exemple: Utilisation des classes ci-dessous, je voudrais stocker seulement Person.name
et Person.surname
dans MetaManager.config
. Le problème est, je ne veux pas stocker les valeurs de name
et surname
, mais une référence au champ. En stockant ces références du champ, plus tard, je peux récupérer le name
et surname
de toute instance de Person
je passerais à MetaManager.getValues()
.
Ce code est similaire à Metamodel API, bien que je ne sache pas si je devrais l'utiliser (puisque Metamodel fait partie de persistence
et ce n'est pas lié à persistence
). Dans cette API, la référence est faite comme ceci Person_.name
en utilisant l'objet EntityType
.
La question est, de quelle manière puis-je stocker une référence à ces propriétés afin que je puisse récupérer la valeur de ces propriétés à partir d'une instance plus tard?
Le code ci-dessous donne un aperçu de ce que j'essaie d'accomplir. Comme vous pouvez le voir, mon problème est dans Person.getValue()
et un toString()
sur cette référence (une référence sur ssn
retournerait donc "ssn"
).
interface IMetable {
Object getValue(Meta meta);
}
class Person implements IMetable {
String ssn;
String name;
String surname;
Person(String ssn, String name, String surname) {
this.ssn = ssn;
this.name = name;
this.surname = surname;
}
@Override
Object getValue(ClassMeta meta) {
// Return the value of the (by meta) referenced field
return null;
}
}
class MetaManager {
Map<Class, Meta[]> config;
public Map<String, String> getValues(IMetable object) {
if(config.containsKey(object.class)) {
ClassMeta[] metamodel = config.get(object.class);
Map<String, String> values = new HashMap();
for(Meta meta : metamodel) {
values.put(meta.toString(), object.getValue(meta).toString());
}
return values;
}
else {
throw new Exception("This class has not been configurated.");
}
}
}
Oui oui oui! L'API Reflection est ce que je cherchais, comment est-ce possible? Je n'y ai pas pensé. +1 :) – Aquillo