0

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

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

此代码类似于Metamodel API,尽管我不确定是否应该使用它(因为 Metamodel 是其中的一部分,persistence并且与 无关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.");
        }
    }
}
4

1 回答 1

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地图之前检查该注释。

于 2013-05-02T07:23:26.067 回答