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

时间:2013-03-05 13:41:01

标签: java android reflection dynamic-cast

我正在尝试创建JSON到Object映射器。它的主要思想是“user”定义一个字典,其中键是JSON属性,值是Objects属性名。那么它是如何工作的(到目前为止):

  1. 从JSON(var jsonValue)获取价值
  2. 从getter获取属性类型(var methodType)
  3. 创建setter方法并从json
  4. 插入值

    唯一的问题是我无法动态地将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;
        }
    

1 个答案:

答案 0 :(得分:0)

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

你不能以这种方式创建原始类型,例如,如果你看一下标准的JDK序列化实现(ObjectWriter的writeObject()),你会看到8个案例的开关。