Code Bye

反射,为对象赋值

 

类似spring xml,
从一个xml读取信息,得到对象,以及对象属性名称,以及属性值。
转换为对象,并从xml里得到的值为对象赋值
现在情况是从xml里得到的值为string类型,
field.set();
就是报错,string不能转换为某类型,
这种情况怎么弄呢,不可能每个类型都取出来判断吧
 if(type.getSimpleName().equals(“Integer”))
        {
            return Integer.parseInt(obj.toString());
        }else if(type.getSimpleName().equals(“Short”))
        {
            return Short.parseShort(obj.toString());
        }else if(type.getSimpleName().equals(“Float”)){
            return Float.parseFloat(obj.toString());
           
        }
             ………………….

没有人回答吗
文本内容解析为对象,用严格的xml方式,或者Json方式都可以吧。
你的文本对象内容是什么样子的?

5分
这个你必需这样做,没有其它更好的办法,当然,你可以下载一个xstram的工具包来帮你完成转换过程。

5分
内省拿到属性的类型之后
可以用beanutils框架的ConvertUtils.convert方法将你读到的值转换为属性的类型

5分
	public static void main(String[] args) {
		Map<String, String> params = new HashMap<String, String>();

		Object bean = new Object();
		Class<?> clazz = bean.getClass();
		Field[] fields = clazz.getDeclaredFields();
		for (Field field : fields) {
			try {
				String fieldName = field.getName();
				Class<?> type = field.getType();
				String methodName = "set"
						+ fieldName.substring(0, 1).toUpperCase()
						+ fieldName.substring(1);

				Method method = clazz.getMethod(methodName, type);
				String typeName = type.getName();

				if (typeName.startsWith("["))
					continue;

				Constructor<?> constructor = type.getConstructor(String.class);
				String paramt = params.get(fieldName);
				Object value = constructor.newInstance(paramt);

				method.invoke(bean, value);

			} catch (NoSuchMethodException e) {
			} catch (SecurityException e) {
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				e.printStackTrace();
			}
		}

	}
目前只支持原始类型赋值,抛砖引玉,其他的自己实现。
引用 2 楼 oh_Maxy 的回复:

文本内容解析为对象,用严格的xml方式,或者Json方式都可以吧。
你的文本对象内容是什么样子的?

<?xml version=”1.0″ encoding=”UTF-8″?>
<beans>
<bean id=”test” class=”com.test.testVO”>
<attr>
<value id=”name”>sara</value>
<value id=”id”>4</value>
<value id=”score”>95</value>
</attr>
</bean>
</beans>

这种格式,通过反射可以转换为对象,主要是赋值出问题,说string不能cast to
某类型,我就想问java有某个方法可以自动转换string为相应属性类型吗

引用 3 楼 linkForJava 的回复:

这个你必需这样做,没有其它更好的办法,当然,你可以下载一个xstram的工具包来帮你完成转换过程。

恩,谢谢,知道有个xstream,可以转对象,主要想学习学习反射这块,谢谢

引用 4 楼 fudongrifdr 的回复:

内省拿到属性的类型之后
可以用beanutils框架的ConvertUtils.convert方法将你读到的值转换为属性的类型

谢谢,我看看。。。

引用 7 楼 u013891739 的回复:
Quote: 引用 2 楼 oh_Maxy 的回复:

文本内容解析为对象,用严格的xml方式,或者Json方式都可以吧。
你的文本对象内容是什么样子的?

<?xml version=”1.0″ encoding=”UTF-8″?>
<beans>
<bean id=”test” class=”com.test.testVO”>
<attr>
<value id=”name”>sara</value>
<value id=”id”>4</value>
<value id=”score”>95</value>
</attr>
</bean>
</beans>

这种格式,通过反射可以转换为对象,主要是赋值出问题,说string不能cast to
某类型,我就想问java有某个方法可以自动转换string为相应属性类型吗

自动转换这个东西会害人的。比如95,你觉得他就一定是整型的么?为什么不是字符串呢?
这个反射要根据你的id值对应的属性,来找该属性名在你类中对应的类型,然后根据对应值、类型,进行构建。

1.通过spring的xml加载可以自动加载成对应javabean。

2.

<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="test" class="com.test.testVO">
<attr>
<value id="name" type="java.lang.String">sara</value>
<value id="id" type="java.lang.Long">4</value>
<value id="score"type="java.lang.Integer" >95</value>
</attr>
</bean>
</beans>

通过配置type属性,知道参数的类型,可直接转,参照 #5.

引用 11 楼 wqc5461 的回复:

1.通过spring的xml加载可以自动加载成对应javabean。

2.

<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="test" class="com.test.testVO">
<attr>
<value id="name" type="java.lang.String">sara</value>
<value id="id" type="java.lang.Long">4</value>
<value id="score"type="java.lang.Integer" >95</value>
</attr>
</bean>
</beans>

通过配置type属性,知道参数的类型,可直接转,参照 #5.

谢谢,刚才想回复,说不能连续回复三次,刚才我报错了,是我写错了,后来就对了,谢谢你。。。

引用 10 楼 oh_Maxy 的回复:
Quote: 引用 7 楼 u013891739 的回复:
Quote: 引用 2 楼 oh_Maxy 的回复:

文本内容解析为对象,用严格的xml方式,或者Json方式都可以吧。
你的文本对象内容是什么样子的?

<?xml version=”1.0″ encoding=”UTF-8″?>
<beans>
<bean id=”test” class=”com.test.testVO”>
<attr>
<value id=”name”>sara</value>
<value id=”id”>4</value>
<value id=”score”>95</value>
</attr>
</bean>
</beans>

这种格式,通过反射可以转换为对象,主要是赋值出问题,说string不能cast to
某类型,我就想问java有某个方法可以自动转换string为相应属性类型吗

自动转换这个东西会害人的。比如95,你觉得他就一定是整型的么?为什么不是字符串呢?
这个反射要根据你的id值对应的属性,来找该属性名在你类中对应的类型,然后根据对应值、类型,进行构建。

那个,我只是举个例子,95不一定非得是数字,我只是想说,我从xml读取出来的是string类型的,我要为该对象赋值,可该对象属性类型不一定都是string类型的,所以想问有什么方法可以把string转为相应的类型,不然为对象赋值,会报错。。


5分
引用 13 楼 u013891739 的回复:
Quote: 引用 10 楼 oh_Maxy 的回复:
Quote: 引用 7 楼 u013891739 的回复:
Quote: 引用 2 楼 oh_Maxy 的回复:

文本内容解析为对象,用严格的xml方式,或者Json方式都可以吧。
你的文本对象内容是什么样子的?

<?xml version=”1.0″ encoding=”UTF-8″?>
<beans>
<bean id=”test” class=”com.test.testVO”>
<attr>
<value id=”name”>sara</value>
<value id=”id”>4</value>
<value id=”score”>95</value>
</attr>
</bean>
</beans>

这种格式,通过反射可以转换为对象,主要是赋值出问题,说string不能cast to
某类型,我就想问java有某个方法可以自动转换string为相应属性类型吗

自动转换这个东西会害人的。比如95,你觉得他就一定是整型的么?为什么不是字符串呢?
这个反射要根据你的id值对应的属性,来找该属性名在你类中对应的类型,然后根据对应值、类型,进行构建。

那个,我只是举个例子,95不一定非得是数字,我只是想说,我从xml读取出来的是string类型的,我要为该对象赋值,可该对象属性类型不一定都是string类型的,所以想问有什么方法可以把string转为相应的类型,不然为对象赋值,会报错。。

可以参考Spring配置bean方式,要求有setter方法的。这边有个例子:

package com.reflect.demo1;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Demo1 {

    public static void main(String[] args) throws ClassNotFoundException, IllegalArgumentException, SecurityException,
            InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException,
            NoSuchFieldException {
        // 省略配置文件解析过程
        // 得到类路径,加载类
        Class<?> clazz = Class.forName("com.reflect.demo1.Pojo1");

        // 对象实例化
        Object bean = clazz.newInstance();

        // 属性"id"配置了值101
        // 属性首字母大写,前面加set,生成setter方法
        String idSetter = "setId";
        Class idType = clazz.getDeclaredField("id").getType();
        // 封装基本类型的String类型构造方法// 本质上就是new Integer(String)方法
        Constructor idTypeCs = idType.getDeclaredConstructor(String.class);
        Method idSetMethod = clazz.getDeclaredMethod(idSetter, idType);
        idSetMethod.invoke(bean, idTypeCs.newInstance("101"));
        // 属性"name"配置了"张三"
        // 生成setter方法
        String nameStter = "setName";
        Class nameType = clazz.getDeclaredField("name").getType();
        // 封装基本类型的String类型构造方法
        Constructor nameTypeCs = nameType.getDeclaredConstructor(String.class);
        Method nameSetMethod = clazz.getDeclaredMethod(nameStter, nameType);
        nameSetMethod.invoke(bean, nameTypeCs.newInstance("张三"));

        // 验证
        Pojo1 pojo = (Pojo1) bean;
        System.out.println(pojo.getId());
        System.out.println(pojo.getName());
    }
}
// 同一包下
class Pojo1 {
    private Integer id;

    private String name;

    public int getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

不过只考虑了封装类型对象,想基本类型int等,如果实现,我只想到一个个的if/else了。。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明反射,为对象赋值