2013-05-02 2 views
0

여러 클래스의 일부 속성을 참조하기 위해 작은 메타 모델을 설정하려고합니다.클래스의 메타 처리 (속성 참조)

: 아래의 클래스를 사용하여, 나는 MetaManager.configPerson.namePerson.surname를 저장하고 싶습니다. 문제는, namesurname의 값을 저장하는 것이 아니라 필드에 대한 참조를 저장하는 것입니다. 필드의 이러한 참조를 저장하면 나중에 namesurnamePerson의 인스턴스 중 MetaManager.getValues()으로 가져올 수 있습니다.

이 코드는 의 일부이며 이후 persistence과 관련이 없으므로이 코드를 사용해야하는지 잘 모르겠지만이 코드는 Metamodel API과 비슷합니다. 이 API에서는 EntityType 개체를 사용하여 Person_.name과 같은 참조를 만듭니다.

질문은 나중에 이러한 속성의 값을 나중에 인스턴스에서 검색 할 수 있도록 이러한 속성에 어떤 참조를 저장할 수 있습니까?

아래 코드는 내가 성취하려는 것을 보여줍니다. 당신이 볼 수 있듯이, 내 문제는 Person.getValue()과 에 대한 참조는 "ssn"을 반환합니다.이 참조에 대한 toString()입니다.

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

예 예 예! 리플렉션 API는 내가 찾고 있었던 것이고, 어떻게 생각했는지는 모른다. +1 :) – Aquillo