我正在尝试设置一个小的元模型,以便引用多个类的一些属性。
示例:使用以下类,我只想在Person.name
中存储Person.surname
和MetaManager.config
。问题是,我不想存储name
和surname
的值,而是存储对该字段的引用。通过存储这些字段的引用,稍后我可以检索name
surname
的任何实例的Person
和MetaManager.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}}
答案 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
地图之前检查该注释。