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);
    }
}
