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 toMap(Object obj, String... ignoreFields) throws IllegalAccessException { HashMap map = new HashMap<>(); //获取对象的Class对象 Class clazz = obj.getClass(); //最外层循环,找当前对象的所有成员变量以及当前对象父类对象的所有成员变量 //只要这个对象实际上不是Object类型的,不是空的,那么就会一直获取父类对象,执行循环 while (clazz!=null&clazz!=Object.class) { //判空 if (obj == null) { throw new NullPointerException("输入的对象不能为null"); } //创建要忽略的成员变量的集合,方便我们查找 Set 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 stringObjectMap = new ObjectToMapConverter().toMap(new Student(16, "张三", 25)); System.out.println(stringObjectMap); } }