`

使用反射动态的给对象赋值

 
阅读更多

实体对象:

public class UserInfo {
	private byte bt;
	private int id;
	private short st;
	private double db;
	private float fl;
	private long lg;
	
	private String name;
	private String email;
	private boolean ifMarriage;
	
	private Date date;
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	public boolean isIfMarriage() {
		return ifMarriage;
	}
	public void setIfMarriage(boolean ifMarriage) {
		this.ifMarriage = ifMarriage;
	}
	public Long getLg() {
		return lg;
	}
	public void setLg(Long lg) {
		this.lg = lg;
	}
	public byte getBt() {
		return bt;
	}
	public void setBt(byte bt) {
		this.bt = bt;
	}
	public double getDb() {
		return db;
	}
	public void setDb(double db) {
		this.db = db;
	}
	public float getFl() {
		return fl;
	}
	public void setFl(float fl) {
		this.fl = fl;
	}
	public short getSt() {
		return st;
	}
	public void setSt(short st) {
		this.st = st;
	}
	public void setLg(long lg) {
		this.lg = lg;
	}

 调用的方法:

 

	/***
	 * 对于map是数组的情况,则转换一下,只取第一个值。
	 * 我想这个东西对于页面有多选框的情况是不适用的
	 * 因为我们无法知道是多选框还是参数名相同的多个参数。
	 * 除非我们能够知道参数上传时是有什么类型的参数传过来的
	 * 是文本框,复选框,还是别的什么东西?
	 * (除非我们特别的标识一下,比如说复选框:我们的名称加一个c,但是这么弄的话又得加不少的判断条件)
	 * 
	 * 如果仅仅是相同的name的参数有多个的情况,可以通过加一下观察变量去解决
	 * 
	 */
	public static void setObjectValue(Map<String,Object> map,Object obj){
		try{
			Class cl = obj.getClass();
			Field[] fl = cl.getDeclaredFields();
			for(Field f : fl){
				for(String str : map.keySet()){
					if(f.getName().equals(str)){
						String st = f.getName();
						st = "set" + st.substring(0, 1).toUpperCase() + st.substring(1);			
						Method method = cl.getMethod(st,f.getType());
						//对不同的类型要进行不同的类型转换
						String typeConver = f.getType().getSimpleName();
						if(typeConver.equals("byte")){
							 method.invoke(obj, Byte.parseByte(map.get(str)+""));
						}else if(typeConver.equals("short")){
						   method.invoke(obj, Short.parseShort(map.get(str)+""));
					    }else if(typeConver.equals("int")){
						   method.invoke(obj, Integer.parseInt(map.get(str)+""));
					    }else if(typeConver.equals("float")){
						   method.invoke(obj, Float.parseFloat(map.get(str)+""));
					    }else if(typeConver.equals("long")){
						   method.invoke(obj, Long.parseLong(map.get(str)+""));
					    }else if(typeConver.equals("double")){
						   method.invoke(obj, Double.parseDouble(map.get(str)+""));
					    }else if(typeConver.equals("String")){
							method.invoke(obj,map.get(str));
						}else if(typeConver.equals("boolean")){
							method.invoke(obj, Boolean.parseBoolean(map.get(str)+""));
						}else if(typeConver.equals("Date")){
							SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
							Date d = sdf.parse(map.get(str)+",");
							method.invoke(obj,d);
						}
					}
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	public static void main(String[] args) throws Exception{
		//对于map的值,暂时只存String的这一种情况。
		Map<String,Object> map = new HashMap<String,Object>();
		map.put("bt", 1);
		map.put("st", 2);
		map.put("id", 3);
		map.put("db", 1.23);
		map.put("fl",1.1);
		map.put("lg", 10000L);
		map.put("name", "yang");
		map.put("email", "xiaoquan328@163.com");
		map.put("date", "2012-03-13");
		map.put("ifMarriage", false);
		UserInfo uinfo = new UserInfo();
		Field[] fls = uinfo.getClass().getDeclaredFields();
		UserInfoTest.setObjectValue(map, uinfo);
		System.out.println(uinfo.getBt());
		System.out.println(uinfo.getSt());
		System.out.println(uinfo.getId());
		System.out.println(uinfo.getLg());
		System.out.println(uinfo.getDb());
		System.out.println(uinfo.getFl());
		System.out.println(uinfo.isIfMarriage());
		System.out.println(uinfo.getName());
		System.out.println(uinfo.getDate());
		System.out.println(uinfo.getEmail());
	}

 说明:

     写jsp的时候,发下request有下面这个方法:request.getParameterMap();(这里每一个key对应的值都是数组。。。。)

     我想,既然可以以map的方式去取值,那么,就可以使用反射动态的的去赋值,遂产生了上面的想法。

    不过实际开发应用中,出现的情况会比上面写的要复杂不少,肯定会还有许多考虑不到的地方,暂时先写到这,什么时候再想起来什么,再改动吧,争取什么时候把大部分的情况都包含了,那个时候再写“添加”和修改功能,应该就很easy了。。。。
 

 

分享到:
评论

相关推荐

    通过构造及反射实现类属性赋值

    给目标对象赋值另一个对象时,只是将源对象的地址指向了目标对象,而并没有执行对象属性的set器,有时需要使用set做通知,本实例通过构造及反射实现类属性自动赋值。

    Java 通过反射给实体类赋值操作

    主要介绍了Java 通过反射给实体类赋值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    RuntimeTest.cs

    C#通过反射给对象赋值

    C#实现利用反射简化给类字段赋值的方法

    主要介绍了C#实现利用反射简化给类字段赋值的方法,涉及C#操作反射的相关技巧,需要的朋友可以参考下

    反射创建对象

    反射进行对象的创建,并在反射的时候,进行赋值

    C#两个相同属性的类赋值方法

    最近有遇到两个类之间的赋值问题,两个类的属性几乎都一样的,所以写了个通过反射获取属性的然后赋值的方法,把一个类的属性的值赋值给另一个类。 框架是.net 4.5 public static D Mapper(S s) { D d = Activator...

    java反射机制给实体类相同字段自动赋值实例

    主要介绍了java反射机制给实体类相同字段自动赋值实例,具有

    JavaScript 反射和属性赋值实例解析

    这篇文章主要介绍了JavaScript 反射和属性赋值实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Java和.NET都有着比较完善的反射机制,用来处理未知的...

    反射实现两个类的对象之间相同属性快速赋值,数据源实体和目标实体将进行转换

    反射实现两个类的对象之间相同属性快速赋值,MapperToModel,数据源实体和目标实体将进行转换

    java反射遍历实体类属性和类型,并赋值和获取值的简单方法

    下面小编就为大家带来一篇java反射遍历实体类属性和类型,并赋值和获取值的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    asp.net利用反射实现给model类赋值的方法

    本文实例讲述了asp.net利用反射实现给model类赋值的方法。分享给大家供大家参考,具体如下: /// /// 给model类自动赋值 /// /// 获取查询一个model实例的sql语句 /// &lt;param name=obj&gt;model实例对象 /// ...

    Java常用的反射方法

    反射获取Class类对象的三种方法 2.1 通过全类名的方式获取 2.2 类名.class 2.3 实例对象.getClass() 2.4 总结 3. 反射获取属性变量 3.1 获取所有public修饰符的成员变量 3.2 获取指定字段并赋值 3.3 获取...

    JDBC+映射文件(M.xml)+反射+对象来完成一个伪ORM框架

    反射回去到一个类,类名,类的所有属性,创建对象,给对象中私有属性赋值。还记得刚开始学java的时候,对于java里的私有属性,想要操作它,得需要通过创建对象调用它set或get方法,才能操作这些私有属性。那么对于使用...

    asp.net中实体类对象赋值到表单的实现代码

    昨天在网上看到了一个利用反射表单赋值到实体类对象的一个方法,自己就在加了个方法,从实体对象到表单,觉的很不错非常省事,所以把他写成了一个类,供以后使用

    底层的技术-----反射技术

    设计一个方法,给一个字符串(类)返回一个对象,对象里面还有属性值 例如考试系统中 Question类型 ATM系统 User类型 Question和User类型都是我们自定义的,这两个类的目的是为了存储值,更像个容器 Service Dao...

    Java Instrumentation Framework.rar

    反射提供的功能,能在运行时(动态)的 1.获取一个类的所有成员变量和方法 2.创建一个类的对象 a.获取对象成员变量&赋值 b.调用对象的方法 c.判断对象所属的类 在注入内存马的过程当中,我们可能需要用到反射...

    java泛型反射注解

    先说一下遇到的问题:通过使用GSON泛型进行报文转换的时候想要对部分关键字段加密,...解决过程:首先通过反射获取到bean下的对象名称。 对象名称获取到了之后需要获取对应的值 对值进行加密,然后再重新赋值到该对象

    负责对象和页面控件之间值的传递

    vb.net实现的,负责控制对象和页面控件之间的赋值。只要配置控件的tag,页面控件的所有赋值均可通过该工程实现。其中使用了反射,设计模式等技术。易与扩展,如果新加控件,只需要重载两个函数即可。使用说明附内。

    day021-反射和注解笔记和代码.rar

    //通过当前的字段对象,给某一个字段赋值取值 field.get(Object obj);//如果是属于非static,就传入一个对象,如果是静态的,就传入null obj:对象 field.set(Object obj, Object value);/...

Global site tag (gtag.js) - Google Analytics