2013-05-02 66 views
0

我想設置一個小元模型以引用多個類的某些屬性。處理meta類(引用屬性)

:使用下面的課,我想只有Person.namePerson.surname存儲在MetaManager.config。問題是,我不想存儲namesurname的值,但是是對該字段的引用。通過存儲這些字段的引用,稍後我可以檢索Person的任何實例的namesurname,我將傳遞給MetaManager.getValues()

此代碼與Metamodel API類似,儘管我不確定是否應該使用此代碼(因爲元模型是persistence的一部分,與persistence無關)。在此API中,使用EntityType對象的參考號是Person_.name

問題是,我可以以什麼方式存儲對這些屬性的引用,以便稍後可以從實例中檢索這些屬性的值?

下面的代碼給出了我試圖完成的草圖。正如你所看到的,我的問題在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

您似乎試圖重新創建反射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地圖前檢查該註釋。

+0

是的是的! Reflection API是我正在尋找的,我怎麼可能沒有想到這一點。 +1 :) – Aquillo 2013-05-02 08:48:30