利用泛型和反射机制封装一个获取实体所有属性值的通用类方法

 思路如下:

   1、通过反射机制,先获取所有属性

   2、通过属性名取得属性get方法名,通过反射机制调用属性方法获取属性值

   3、将取到的属性值通过Map<属性名,属性值>进行封装,只要调用方法就传入实体就可以获取到返回的map

总结:因为采用的是泛型封装,封装好的类方法可以通用,我用在泛型封装sql语句的时候需要用到这个反射机制

项目目录结构如下:

com.hexu.utils.ReflectCommon.java代码代码如下:

package com.hexu.utils;

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

public class ReflectCommon<T> {

	public Map test(T model) {
		Field[] fields = model.getClass().getDeclaredFields(); //获取说有属性,返回Field类型数组
		Map<String, Object> values = new HashMap<String, Object>();

		try {
			for (int i = 0; i < fields.length; i++) {
				String nameinit = fields[i].getName(); // 获取属性名
				String name = nameinit;
				name = name.substring(0, 1).toUpperCase() + name.substring(1); // 将属性名的首字母大写,方便获取set和get方法
				String type = fields[i].getGenericType().toString(); // 获取属性类型

				if (type.equals("class java.lang.String")) {   //如果类型是类,要加class 并指定类路径
					Method m = model.getClass().getMethod("get" + name); // 构造get方法
					String value = (String) m.invoke(model); // 调用get方法获取属性值
					values.put(nameinit, value);
				}
				if (type.equals("class java.lang.Integer")) {
					Method m = model.getClass().getMethod("get" + name); // 构造get方法
					Integer value = (Integer) m.invoke(model); // 调用get方法获取属性值
					values.put(nameinit, value);
				}
				if (type.equals("int")) {
					Method m = model.getClass().getMethod("get" + name); // 构造get方法
					Integer value = (Integer) m.invoke(model); // 调用get方法获取属性值
					values.put(nameinit, value);
				}
				if (type.equals("class java.lang.Boolean")) {
					Method m = model.getClass().getMethod("get" + name); // 构造get方法
					String value = (String) m.invoke(model); // 调用get方法获取属性值
					values.put(nameinit, value);
				}
				if (type.equals("class java.util.Date")) {
					Method m = model.getClass().getMethod("get" + name);
					Date value = (Date) m.invoke(model);
					values.put(nameinit, value);
				}
			}
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return values;
	}

}

 com.hexu.model.User.java模型代码如下:

package com.hexu.model;

public class User {
	
	private int uid;
	private String userName;
	private int age;
	public int getUid() {
		return uid;
	}
	public void setUid(int uid) {
		this.uid = uid;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	

}

 com.hexu.test.TestDemo.java测试代码如下:

package com.hexu.test;

import java.util.Map;

import org.junit.Test;

import com.hexu.model.User;
import com.hexu.utils.ReflectCommon;

public class TestDemo {
	
	@Test
	public void test() {
		User user = new User();
		user.setUid(1001);
		user.setUserName("河旭");
		user.setAge(18);
		
		ReflectCommon<User> common = new ReflectCommon<User>();
		Map<String,Object> map = common.test(user);
		for (Map.Entry<String, Object> entry : map.entrySet()) { 
			  System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); 
		}
		
	}

}

 输出结果如下:

Key = uid, Value = 1001
Key = userName, Value = 河旭
Key = age, Value = 18

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值