0

複数のクラスのいくつかのプロパティを参照するために、小さなメタモデルをセットアップしようとしています。

Person.name: 以下のクラスを使用して、 と のみを格納Person.surnameしたいMetaManager.configname問題は、との値を保存したくないのですがsurname、フィールドへの参照です。これらのフィールドの参照を保存することで、後で渡される任意のインスタンスのnameandを取得できます。surnamePersonMetaManager.getValues()

このコードはMetamodel APIに似ていますが、これを使用する必要があるかどうかはわかりません (Metamodel は の一部でpersistenceあり、これは とは関係がないためpersistence)。この API ではPerson_.name、オブジェクトを使用してこのように参照を行いEntityTypeます。

問題は、後でインスタンスからこれらのプロパティの値を取得できるように、これらのプロパティへの参照をどのように保存できるかということです。

以下のコードは、私が達成しようとしていることのスケッチを示しています。ご覧のとおり、私の問題は in Person.getValue()and a toString()on this reference です (したがって、 on の参照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 に答える