2013-05-02 1 views
0

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."); 
     } 
    } 
} 

Répondre

1

Vous semblez essayer de recréer l'API de réflexion.

Pourquoi ne pas vous venez de mettre en œuvre MetaManager comme ceci:

public class MetaManager 
{ 
    public Map<String, Object> getValues(Object object) 
    { 
    Map<String, Object> values = new HashMap<String, Object>(); 

    for (Field field : object.getClass().getFields()) 
    { 
     boolean wasAccessible = field.isAccessible(); 
     try 
     { 
     field.setAccessible(true);  
     values.put(field.getName(), field.get(object)); 
     } 
     finally 
     { 
     field.setAccessible(wasAccessible); 
     } 
    } 

    return values; 
    } 
} 

Si vous avez besoin d'un sous-ensemble de champs puis utilisez une annotation pour marquer les champs, puis vérifier que Annotation avant de l'ajouter à la carte values .

+0

Oui oui oui! L'API Reflection est ce que je cherchais, comment est-ce possible? Je n'y ai pas pensé. +1 :) – Aquillo

Questions connexes