1

Map<String, String>プロキシされた Java Bean を介してタイプセーフな読み取りおよび書き込みアクセスを提供するライブラリを探しています。例えば:

interface Person {
  String getName();
  void setName(String name);
  int getAge();
  void setAge(int age);
}

Map<String, String> data = new HashMap<String, String>() {{
  put("name", "juni");
  put("age", "4");
}}

Person p = HypotheticalLibrary.bind(Person.class, data);
p.getName(); // returns "juni"
p.setAge(5); // calls data.put("age", "5") --- notice the implicit type conversion

そのようなことはありますか?

4

3 に答える 3

1

私は一つも知りません。ただし、proxyを使用して作成するのはかなり簡単です。ゲッターとセッターを認識し、それに応じてマップを取得または配置するInvocationHandlerを作成する必要があります。メソッド名をマップのキーに変換するという厄介なビットと、型を変換する方法を理解するという難しいビットがあります。

約 60 行のコードで手早く汚い実装を書きました。型に対してかなり不器用な仕事をします。すべての基本的なタイプに対してまともな仕事をするには、さらに100ほどかかります。

于 2012-07-23T22:23:06.277 に答える
1

スプリングを依存関係として使用しても問題ないと仮定すると、提案されているプロキシ アプローチを使用できます。BeanUtils クラスは、メソッド名をプロパティ記述子に変換して、名前を取得できるようにします。インターフェイス自体を操作しているため、型変換は必要ありません。そのため、コンパイラは正しい型を送信する (したがって、正しい型を出力する) ことを保証します。

static interface Person {
    void setName(String name);
    String getName();
    void setAge(int age);
    int getAge();
}


public static Person createPerson() {
    return createPerson(new HashMap<String, String>());
}

public static Person createPerson(final Map<String, String> props) {
    InvocationHandler ih = new InvocationHandler() {
        private TypeConverter typeConverter = new SimpleTypeConverter();

        @Override
        public Object invoke(Object source, Method method, Object[] params)
                throws Throwable {
            PropertyDescriptor pd = BeanUtils.findPropertyForMethod(method);
            if (method.getName().startsWith("set")) {
                props.put(pd.getName(), typeConverter.convertIfNecessary(params[0], String.class));
                return null;
            }
            else if (method.getName().startsWith("get") ||
                     method.getName().startsWith("is")) {
                Object res = props.get(pd.getName());
                return typeConverter.convertIfNecessary(res, method.getReturnType());
            }
            return null;
        }
    };

    Person p = (Person) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
            new Class<?>[] { Person.class },
            ih);

    return p;
}

public static void main(String args[]) {
    final Map<String, String> props = new HashMap<String, String>();
    props.put("name", "Matt");
    props.put("age", "4");

    Person p = createPerson(props);

    System.out.println(p.getName());
    System.out.println(p.getAge());

}
于 2012-07-24T02:04:31.017 に答える
0

あるとは思いませんが、mvelまたはognlまたはspelの助けを借りて独自のものを構築できます。私はいつか自分自身を構築しました。

于 2012-07-23T20:44:49.383 に答える