动态设置对象的值(动态属性/类型)



我试图创建JSON到对象映射器。它的主要思想是"user"定义一个字典,其中键是JSON属性,值是object属性名。那么它是如何工作的(到目前为止):

  1. 从JSON获取值(var jsonValue)
  2. 从getter (var methodType)获取属性类型
  3. 创建setter方法并从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;
    }

您可以在运行时使用反射(如您所使用的)和. newinstance()方法创建未知类型的非原语对象。

你不能用这种方式创建基本类型,例如,如果你看一下标准JDK的序列化实现(objectwwriter的writeObject()),你会看到8个case的切换。

相关内容

  • 没有找到相关文章

最新更新