处理类的元(对属性的引用)

时间:2013-05-02 06:55:35

标签: java metamodel

我正在尝试设置一个小的元模型,以便引用多个类的一些属性。

示例:使用以下类,我只想在Person.name中存储Person.surnameMetaManager.config。问题是,我不想存储namesurname的值,而是存储对该字段的引用。通过存储这些字段的引用,稍后我可以检索name surname的任何实例的PersonMetaManager.getValues(),我将传递给persistence

此代码与Metamodel API类似,但我不确定是否应该使用此代码(因为Metamodel是persistence的一部分而且与Person_.name无关)。在此API中,使用EntityType对象进行类似Person.getValue()的引用。

问题是,我可以以什么方式存储对这些属性的引用,以便稍后可以从实例中检索这些属性的值?

下面的代码概述了我正在努力实现的目标。正如您所看到的,我的问题出现在toString()ssn上此引用("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."); } } } )。

{{1}}

1 个答案:

答案 0 :(得分:1)

您似乎正在尝试重新创建反射API。

为什么不像这样实施MetaManager

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

如果您需要字段子集,请使用注释标记这些字段,然后在将其添加到values地图之前检查该注释。