0

JSON toObjectmapperを作成しようとしています。その主な考え方は、「ユーザー」が、キーがJSON属性であり、値がオブジェクトのプロパティ名であるディクショナリを定義することです。それで、それはどのように機能しますか(これまでのところ):

  1. JSONから値を取得する(var jsonValue)
  2. getterからプロパティタイプを取得します(var methodType)
  3. セッターメソッドを作成し、jsonから値を挿入します

唯一の問題は、jsonValueをオブジェクトに動的にキャストできないことです。オブジェクトタイプ(methodType)を確認してから、String、Long、Integerなどで別の方法でキャストする必要があります。どういうわけか動的にキャストできますか?

    private Cookbook createCookbook(JsonObject jsonCookbook) {
    //Cookbook to return
    Cookbook cookbook = new Cookbook();

    Enumeration<String> e = mappingDictionary.keys();
    while (e.hasMoreElements()) {
        //get JSON value
        String mappingKey = e.nextElement();
        JsonElement json = jsonCookbook.get(mappingKey);
        String jsonValue = json.getAsString();

        //set JSON value to property
        String mappingValue = mappingDictionary.get(mappingKey);

        //reflection
        try {
            //get type of the getter
            String getMethodName = "get" + mappingValue; 
            Method getMethod = cookbook.getClass().getMethod(getMethodName, null);
            Class<?> methodType = getMethod.getReturnType(); 

            //set methods
            String setMethodName = "set" + mappingValue;
            Method setMethod = cookbook.getClass().getMethod(setMethodName, methodType);

            //set value to property
            /* DONT WANT TO DO IT LIKE THIS, THIS IS MY PROBLEM */
            if (methodType.equals(String.class))
                setMethod.invoke(cookbook, jsonValue);
            if (methodType.equals(Long.class))
                setMethod.invoke(cookbook, Long.valueOf(jsonValue));

        } catch (NoSuchMethodException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IllegalArgumentException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IllegalAccessException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (InvocationTargetException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }           
    }

    return cookbook;
    }
4

1 に答える 1

0

リフレクション(使用したように)と .newInstance() メソッドを使用して、実行時に不明なタイプの非プリミティブ オブジェクトを作成できます。

この方法でプリミティブ型を作成することはできません。たとえば、標準の JDK シリアライゼーション実装 (ObjectWriter の writeObject()) を見ると、8 つのケースでスイッチが表示されます。

于 2013-03-05T19:59:53.577 に答える