zhongrj
2023-08-24 6e6127f62c11396037d8d0feb35ae8e8155c7aa5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package cn.gistack.sm.sjztmd.util;
 
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;
 
/**
 * 反射通用
 * @param <T>
 */
public class ReflectCommon<T> {
 
    /**
     * 获取对象的属性相关信息
     * @param model
     * @return
     */
    public Map test(T model) {
        //获取说有属性,返回Field类型数组
        Field[] fields = model.getClass().getDeclaredFields();
        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;
                // 将属性名的首字母大写,方便获取set和get方法
                name = name.substring(0, 1).toUpperCase() + name.substring(1);
                // 获取属性类型
                String type = fields[i].getGenericType().toString();
 
                //如果类型是类,要加class 并指定类路径
                if (type.equals("class java.lang.String")) {
                    // 构造get方法
                    Method m = model.getClass().getMethod("get" + name);
                    // 调用get方法获取属性值
                    String value = (String) m.invoke(model);
                    values.put(nameinit, value);
                }
                if (type.equals("class java.lang.Integer")) {
                    // 构造get方法
                    Method m = model.getClass().getMethod("get" + name);
                    // 调用get方法获取属性值
                    Integer value = (Integer) m.invoke(model);
                    values.put(nameinit, value);
                }
                if (type.equals("int")) {
                    // 构造get方法
                    Method m = model.getClass().getMethod("get" + name);
                    // 调用get方法获取属性值
                    Integer value = (Integer) m.invoke(model);
                    values.put(nameinit, value);
                }
                if (type.equals("class java.lang.Boolean")) {
                    // 构造get方法
                    Method m = model.getClass().getMethod("get" + name);
                    // 调用get方法获取属性值
                    String value = (String) m.invoke(model);
                    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;
    }
 
    /**
     * 通过属性名称获取属性值
     * @param model
     * @param fieldName 属性名
     * @return
     */
    public Object getFieldValue(T model,String fieldName) {
        //获取说有属性,返回Field类型数组
        Field[] fields = model.getClass().getDeclaredFields();
 
        try {
            for (Field field : fields) {
                if (field.getName().equals(fieldName)) {
                    // 将属性名的首字母大写,方便获取set和get方法
                    fieldName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
                    // 构造get方法
                    Method m = model.getClass().getMethod("get" + fieldName);
                    // 调用get方法获取属性值并返回
                    return m.invoke(model);
                }
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
        // 返回
        return null;
    }
 
    /**
     * 通过属性名称给属性赋值
     * @param model
     * @param fieldName 属性名
     * @param value 值
     * @return
     */
    public void setFieldValue(T model,String fieldName,Object value) {
        //获取说有属性,返回Field类型数组
        Field[] fields = model.getClass().getDeclaredFields();
 
        try {
            for (Field field : fields) {
                if (field.getName().equals(fieldName)) {
                    field.setAccessible(true);
                    field.set(model,value);
                }
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
 
//    public static void main(String[] args) {
//        User user = new User();
//        user.setAccount("123456");
//        ReflectCommon<User> reflectCommon = new ReflectCommon<User>();
//        String account =(String) reflectCommon.getFieldValue(user, "account");
//        System.out.println("account = " + account);
//        reflectCommon.setFieldValue(user,"account","9999");
//        System.out.println("newaccount = " + user.getAccount());
//    }
}