ObjectToMapConverter.java 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package J20250806.reflection;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Modifier;
  4. import java.util.HashMap;
  5. import java.util.HashSet;
  6. import java.util.Map;
  7. import java.util.Set;
  8. /**
  9. * @author WanJl
  10. * @version 1.0
  11. * @title ObjectToMapConverter
  12. * @description
  13. * @create 2025/8/6
  14. */
  15. public class ObjectToMapConverter {
  16. /**
  17. * 将对象转换为Map,非静态成员变量作为Key,成员变量值为Value
  18. *
  19. * @param obj 要转换的对象
  20. * @param ignoreFields 要忽略的成员变量名
  21. * @return 转换后的Map
  22. */
  23. public Map<String, Object> toMap(Object obj, String... ignoreFields) throws IllegalAccessException {
  24. HashMap<String, Object> map = new HashMap<>();
  25. //获取对象的Class对象
  26. Class<?> clazz = obj.getClass();
  27. //最外层循环,找当前对象的所有成员变量以及当前对象父类对象的所有成员变量
  28. //只要这个对象实际上不是Object类型的,不是空的,那么就会一直获取父类对象,执行循环
  29. while (clazz!=null&clazz!=Object.class) {
  30. //判空
  31. if (obj == null) {
  32. throw new NullPointerException("输入的对象不能为null");
  33. }
  34. //创建要忽略的成员变量的集合,方便我们查找
  35. Set<String> ignoreSet = new HashSet<>();
  36. for (String field : ignoreSet) {
  37. //如果这个被忽略的成员变量不是空的就放进忽略集合
  38. if (field != null && !field.trim().isEmpty()) {
  39. ignoreSet.add(field);
  40. }
  41. }
  42. //获取所有的成员变量
  43. Field[] fields = clazz.getDeclaredFields();
  44. //遍历这些成员遍历
  45. for (Field field : fields) {
  46. //判断,要跳过所有的静态成员变量
  47. if (Modifier.isStatic(field.getModifiers())) {
  48. continue;//跳过
  49. }
  50. //获取成员变量的名称
  51. String fieldName = field.getName();
  52. //跳过需要忽略的成员变量---一会使用hashSet实现
  53. if (ignoreSet.contains(fieldName)) {
  54. continue;
  55. }
  56. //设置我们可以访问私有成员变量
  57. field.setAccessible(true);
  58. //System.out.print("成员变量名:"+fieldName);
  59. //获取到变量值
  60. Object value = field.get(obj);
  61. //System.out.println("变量值为:"+value);
  62. //将成员变量名作为key,值作为value添加进map集合
  63. map.put(fieldName, value);
  64. }
  65. //处理父类成员变量
  66. clazz=clazz.getSuperclass();
  67. }
  68. return map;
  69. }
  70. public static void main(String[] args) throws IllegalAccessException {
  71. Map<String, Object> stringObjectMap = new ObjectToMapConverter().toMap(new Student(16, "张三", 25));
  72. System.out.println(stringObjectMap);
  73. }
  74. }