思路如下:
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