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

    xiaoxiao2024-12-28  65

     思路如下:

       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

     

    最新回复(0)