利用反射机制 实现 javabean 转化为 map

package com.test.entity;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class ConvertUtil {

	public static Map fromBean(Object object) throws IllegalArgumentException, IllegalAccessException, InstantiationException, InvocationTargetException, ClassNotFoundException
	{

		Map<String, Object> map=new HashMap<String, Object>();
		Class class1=object.getClass();
		Field[] fields=class1.getDeclaredFields();
		Method[] methods=class1.getMethods();

		for(Field eachField:fields)
		{

			String key=eachField.getName();//字段名称

			String methodName="get"+key.substring(0, 1).toUpperCase()+key.substring(1);//方法名称

			Method method=getMethodByName(methods, methodName);//得到方法

			if(eachField.getType().isPrimitive())
			{
				System.out.println(methodName);
				map.put(key, method.invoke(object, null));
				continue;
			}

			Class theClass=Class.forName(eachField.getType().getName());

			if(!Collection.class.isAssignableFrom(theClass)){//不是集合			

				if(method==null)//get方法存在
					continue;
				try {
					Object result=method.invoke(object, null);//执行方法
					map.put(key, result);//放入map

				} catch (InvocationTargetException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}else {

				Collection result=(Collection) method.invoke(object, null);
				Iterator it=result.iterator();

				Object object2=theClass.newInstance();
				Collection collection=(Collection<Map>) object2;

				while (it.hasNext()) {
					Object object3=it.next();

					Map map2=ConvertUtil.fromBean(object3);
					collection.add(map2);

				}

				map.put(key, collection);

			}

		}

		return map;

	}

	private static Method getMethodByName(Method[] methods,String name) {

		for(Method each:methods)
		{
			if(each.getName().equals(name))
				return each;
		}

		return null;	

	}

}
package com.test.entity;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Random;

public class ConvertUtilTest {

	public static void main(String[] args) {

		Demo demo=new Demo();
		demo.setStr("abcdefg");
		ArrayList list=new ArrayList<demoitem>();

		String randomsString="abcdefghijklmnopqrstuvwxyz";
		for(int i=0;i<5;i++)
		{
			DemoItem demoItem=new DemoItem();
			demoItem.setStrr(randomsString.substring(i, i+3));
			list.add(demoItem);
		}
		demo.setDemoList(list);

		try {
			Map map=ConvertUtil.fromBean(demo);
			System.out.println(map.toString());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		

	}
}
</demoitem>
package com.test.entity;

import java.util.ArrayList;
import java.util.List;

public class Demo {

	private String str;
	private ArrayList demoList;
	public String getStr() {
		return str;
	}
	public void setStr(String str) {
		this.str = str;
	}
	public ArrayList getDemoList() {
		return demoList;
	}
	public void setDemoList(ArrayList demoList) {
		this.demoList = demoList;
	}
	@Override
	public String toString() {
		return "Demo [demoList=" + demoList + ", str=" + str + "]";
	}

}
package com.test.entity;

public class DemoItem {

	private String strr;

	public String getStrr() {
		return strr;
	}

	public void setStrr(String strr) {
		this.strr = strr;
	}

	@Override
	public String toString() {
		return "DemoItem [strr=" + strr + "]";
	}

}

利用反射机制 实现 javabean 转化为 map

时间: 2024-07-28 15:49:52

利用反射机制 实现 javabean 转化为 map的相关文章

java利用反射机制完成JavaBean的属性赋值

今天碰到一个场景,就是一个JavaBean,有些属性的值需要去数据库其他表中获取,这样就需要调用其他dao方法得到这个值,然后再set进去. 可是问题来了,如果需要用这种方式赋值的属性特别多的话,一个一个set进去就需要写很多set方法,代码不仅冗余,而且很麻烦. 于是就想通过反射机制去自动set值. 假设有JavaBean为CreditRatingFile.java类,某些属性值需要调用CreditRatingFileApplyService类中的方法获得,并拿到返回值再set出这些属性. 一

java利用反射机制判断对象的属性是否为空

java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String>(); validateMap.put("serial", "编号");validateMap.put("major", "专业"); public static <T> String validateFiledIs

利用反射机制,获取类的字段、方法、并实现简单调用

这篇文章是为之后要介绍Android的ICO框架做预备的,所以,如果想最近学习Android的ICO框架的同学,可以稍微看一下. 首先,简单介绍一下Java里面的反射. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 不知道这样的一段解释,你能否看懂.如果更简单的说,反射就是能够根据你给出类名实例化出一个实实在在的对象.所以,对象的实例

java中利用反射机制绕开编译器对泛型的类型限制

首先看下面这个例子 public static void main(String[] args) { ArrayList<Integer> al1 = new ArrayList<Integer>(); al1.add(1); ArrayList<String> al2 = new ArrayList<String>(); al2.add("hello"); //int型链表和string型链表,结果为true System.out.pr

Android利用反射机制为实体类属性赋值

在做android项目时,有时会遇到从网络上获取json类型数据,赋值给实体类,实体类属性少可以一个一个的赋值,如果实体类有很多属性,赋值可能就要耗很长的功夫了,幸好Java给我们提供了反射机制.下面是在我在android中如何利用java反射机制给实体类赋值. 在Android中利用反射机制为实体类属性赋值,首先需要导入一下两个包 import java.lang.reflect.Field; import java.lang.reflect.Method; 给实体类赋值首先需要一个实体类,这

NPOI操作excel——利用反射机制,NPOI读取excel数据准确映射到数据库字段

> 其实需求很明确,就是一大堆不一样的excel,每张excel对应数据库的一张表,我们需要提供用户上传excel,我们解析数据入库的功能实现. 那么,这就涉及到一个问题:我们可以读出excel的表头,但是怎么知道每个表头具体对应数据库里面的字段呢? 博主经过一段时间的思考与构思,想到一法:现在的情况是我们有excel表A,对应数据库表B,但是A与B具体属性字段的映射关系我们不知.那我们是不是可以有一个A到B的映射文件C呢? 我想,说到这,大家就很明了了... 第一步:为每张excel创建一个与

利用反射机制,对对象的属性值进行自动设置

import java.lang.reflect.Method; /** * 对象的属性值自动设置,利用反射机制 */ public class AutoSet { /** * 将源对象的属性值赋值到目标对象,属性名一致,且源对象有get方法,目标对象有set方法 * @param src 源对象 * @param target 目标对象 * @return 赋值后的目标对象 */ public static Object autoGetterAndSetter(Object src, Obje

java反射机制(一)—— 利用反射机制实例化对象

一.Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体.或对其fields设值.或唤起其methods.(度娘文库是这么说的) 二.这篇文章主要介绍一下通过反射机制去实例化一个类的对象,然后调用其方法.本文主要介绍两种方式,第一种就是通过构造函数来实例化,第二种就是通过Cl

利用反射机制获取属性的值遇到的坑

类: public Class Test { public string name; public string value; } Test t=new Test(); t.name="abc"; t.value="123"; string str=(string)t.GetType().GetProperty("name").GetValue(t,null); 找了3个小时,都找不出问题在哪里,由于这是我自己写的类,所以我就怀疑是不是类有问题,