`

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

 
阅读更多

实体对象:

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了。。。。
 

 

分享到:
评论

相关推荐

    C#2.0中通过反射功能给类赋值

    - 如果值不为空,使用`PropertyInfo`对象的`SetValue`方法给当前对象的相应属性赋值。`SetValue`方法接受三个参数:要设置的实例、新值和一个可选的索引器数组(在这个例子中,我们传入`null`,因为我们不需要索引...

    java反射给指定字段赋值

    下面是一个完整的示例代码,展示如何使用反射给指定字段赋值: ```java import java.lang.reflect.Field; public class TestReflection { public static void main(String[] args) throws Exception { // 创建A类...

    reflection给相同对象赋值

    "reflection给相同对象赋值"这个话题涉及到使用反射来复制一个对象的所有属性到另一个同类型的对象。下面将详细探讨如何通过反射实现这一功能,以及反射在Java中的应用。 首先,我们要理解Java中的反射API,主要...

    利用反射给属性赋值

    本篇文章将详细探讨如何利用反射来给对象的属性赋值,以及这个过程中的关键知识点。 一、反射的概念 反射是指在程序运行期间获取并操作类、接口、字段和方法等元数据的能力。通过反射,我们可以在运行时动态地创建...

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

    Java 通过反射给实体类赋值操作是 Java programming 语言中的一种常用技术,通过使用 Java 的反射机制,可以将请求中的参数赋值给实体类对象,从而简化了数据的处理过程。下面是该技术的详细说明: 什么是 Java ...

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

    在类属性赋值的场景中,我们可以创建一个带有源对象作为参数的构造函数,然后在构造函数内部将源对象的属性值赋给新对象。这种方式确保了属性的正确复制,同时如果源对象的属性有set器(setter方法),可以通过set器...

    父类赋值给子类

    当需要将父类的对象赋值给子类的对象时,通常的目标是保留父类的所有属性值,并可能在子类中初始化额外的属性。有几种方法可以实现这一点: 1. **构造函数参数**: 子类的构造函数可以接受一个父类对象作为参数,...

    c# 变量反射使用赋值

    在C#编程中,反射是一种强大的工具,它允许我们在运行时检查类型、接口、属性、方法等信息,并能动态地创建对象和调用方法。在本案例中,我们将探讨如何利用反射来实现变量的动态赋值,特别是在WPF(Windows ...

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

    本文将深入探讨如何利用反射来简化给类字段赋值的过程,这对于动态操作对象属性和执行未知类型的操作尤其有用。 首先,我们需要了解C#中的反射是如何工作的。`System.Reflection`命名空间提供了所有关于反射的类。...

    C#数据实体类中如何给属性赋值

    ### C# 数据实体类中如何给属性赋值 在C#开发中,处理数据库查询结果时,经常需要将查询结果映射到实体类中。本文将详细介绍如何在C#的数据实体类中为属性赋值,特别是当从数据库中取出的是一个`DataSet`对象时。 ...

    利用反射实现JavaBean 的自动赋值

    5. **调用setter方法**:通过反射调用setter方法,将转换后的值赋给JavaBean的相应属性。 #### 示例代码解析 在提供的代码片段中,可以看到`ParameterUtil`类的核心方法`setFormBean()`实现了上述逻辑。该方法接受...

    实体类反射非空赋值,AjaxJson工具类

    总的来说,实体类反射非空赋值以及AjaxJson工具类的应用,是Java后端开发中的常见实践,它涉及到了Java反射API的使用、JSON数据与Java对象的转换,以及如何编写高效的工具类来简化这些操作。理解并熟练掌握这些技能...

    RuntimeTest.cs

    C#通过反射给对象赋值

    MyBatis拦截器:给参数对象属性赋值的实例

    在实际赋值部分,由于示例代码没有给出具体的赋值逻辑,通常这会涉及到反射(`java.lang.reflect.InvocationTargetException`和`BeanUtils`类的引用暗示了这一点),通过反射来设置对象的属性,如设置当前操作用户的...

    【ASP.NET编程知识】asp.net利用反射实现给model类赋值的方法.docx

    通过使用反射,开发者可以动态地将数据库查询结果赋值给 Model 类的属性,从而简化数据访问和业务逻辑处理。 在本文中,我们将学习如何使用 ASP.NET 中的反射机制来实现给 Model 类赋值的方法。我们将通过一个简单...

    java由类的完整路径利用反射给接口注入对象

    我们可以将实现了接口的类的对象赋值给接口类型的引用,实现多态性。 6. **依赖注入**:依赖注入(Dependency Injection,简称DI)是一种设计模式,它帮助解耦代码,使得组件之间通过接口进行交互,而不是直接引用...

    反射创建对象

    本文将深入探讨如何使用反射创建对象,并在反射过程中进行赋值。 首先,我们需要理解Java中的`Class`对象。每个类在运行时都有一个与之关联的`Class`对象,它包含了该类的所有元数据。我们可以通过以下三种方式获取...

    用反射来解决字段多带来的烦恼 不用一个一个字段来赋值了

    在C#编程中,当我们需要处理具有...这些文件与反射的使用没有直接关系,但在实际开发过程中,反射技术可能被应用于这些文件中的某些逻辑,比如动态加载页面控件,解析配置文件,或者在数据库操作中处理未知类型的对象。

    利用反射子父类赋值高效工具类案例extends_setvalue.zip

    当我们有一个类的对象,并且知道其类名或对象的类型时,我们可以使用反射来访问类的私有成员,包括字段和方法。这通常通过以下步骤实现: 1. 获取Class对象:通过`Class.forName()`方法或对象的`getClass()`方法。 ...

Global site tag (gtag.js) - Google Analytics