1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- package J20250806.reflection;
- import java.lang.reflect.Field;
- import java.lang.reflect.Modifier;
- import java.util.HashMap;
- import java.util.HashSet;
- import java.util.Map;
- import java.util.Set;
- /**
- * @author WanJl
- * @version 1.0
- * @title ObjectToMapConverter
- * @description
- * @create 2025/8/6
- */
- public class ObjectToMapConverter {
- /**
- * 将对象转换为Map,非静态成员变量作为Key,成员变量值为Value
- *
- * @param obj 要转换的对象
- * @param ignoreFields 要忽略的成员变量名
- * @return 转换后的Map
- */
- public Map<String, Object> toMap(Object obj, String... ignoreFields) throws IllegalAccessException {
- HashMap<String, Object> map = new HashMap<>();
- //获取对象的Class对象
- Class<?> clazz = obj.getClass();
- //最外层循环,找当前对象的所有成员变量以及当前对象父类对象的所有成员变量
- //只要这个对象实际上不是Object类型的,不是空的,那么就会一直获取父类对象,执行循环
- while (clazz!=null&clazz!=Object.class) {
- //判空
- if (obj == null) {
- throw new NullPointerException("输入的对象不能为null");
- }
- //创建要忽略的成员变量的集合,方便我们查找
- Set<String> ignoreSet = new HashSet<>();
- for (String field : ignoreSet) {
- //如果这个被忽略的成员变量不是空的就放进忽略集合
- if (field != null && !field.trim().isEmpty()) {
- ignoreSet.add(field);
- }
- }
- //获取所有的成员变量
- Field[] fields = clazz.getDeclaredFields();
- //遍历这些成员遍历
- for (Field field : fields) {
- //判断,要跳过所有的静态成员变量
- if (Modifier.isStatic(field.getModifiers())) {
- continue;//跳过
- }
- //获取成员变量的名称
- String fieldName = field.getName();
- //跳过需要忽略的成员变量---一会使用hashSet实现
- if (ignoreSet.contains(fieldName)) {
- continue;
- }
- //设置我们可以访问私有成员变量
- field.setAccessible(true);
- //System.out.print("成员变量名:"+fieldName);
- //获取到变量值
- Object value = field.get(obj);
- //System.out.println("变量值为:"+value);
- //将成员变量名作为key,值作为value添加进map集合
- map.put(fieldName, value);
- }
- //处理父类成员变量
- clazz=clazz.getSuperclass();
- }
- return map;
- }
- public static void main(String[] args) throws IllegalAccessException {
- Map<String, Object> stringObjectMap = new ObjectToMapConverter().toMap(new Student(16, "张三", 25));
- System.out.println(stringObjectMap);
- }
- }
|