循环class对象中的所有属性

循环对象中的属性,并给属性设值  

    在写代码的时候经常会需要去循环一个class对象中的所有属性。

       首先需要获取这个对象的所有属性,通过getClass().getDeclaredFields()这个方法就可以获取对象的所有属性,获取到的是一个Field[数组Field[],如下

    Object obj = new Object();

    Field[] rootFields = obj.getClass().getDeclaredFields();

       然后对这个数组进行循环即可,循环中数组的对象我们可以看到是Field 类型的

    for (Field rootField : rootFields)

      1、rootField.getType().getName()可以获取属性的类型,即这个属性是Object类型,List类型,还是其它的。

      String rfClassName = rootField.getType().getName();

      List类型:rfClassName.equals("java.util.List")

      String类型:rfClassName.equals("java.lang.String")

      BigDecimal:类型:rfClassName.equals("java.math.BigDecimal")

      int:类型:rfClassName.equals("java.lang.Integer")

      其它的不全部列了

     2、个性某个属性的值

  •  如果属性类型rfClassName是String、int、BigDecimal这种非对象、或者对象集合的类型,

      则可以直接rootField.set(obj, "abc")给obj对象的rootField这个属性设置为"abc"

      或者可以直接rootField.set(obj, BigDecimal.ZERO)给obj对象的rootField这个属性设置为BigDecimal.ZERO

      或者可以直接rootField.set(obj, new Integer(0))给obj对象的rootField这个属性设置为0

 

  • 如果属性类型是对象类型,则需要先rootField.getType().newInstance()通过这个方法先去new一个对象出来,然后再通过

      rootField.set(obj, subObj)这个方法给它设置一个属性,代码如下,原理其实和上面几种类型一致。

                                            Object subObj = rootField.getType().newInstance();

                                            rootField.set(obj, subObj);

  • 如果属性类型是List类型,先需要List list = (List<?>) rootField.get(obj);获取这个list属性,获取去获取这个List的保存的数据类  型Class<?> clazz = map.get(rootField.getName());再通过这个获取到的数据类型class去new一个对象Object subObj1 = clazz.newInstance();最后把对象subObj1 追加到list中,代码如下

                                            Class<?> clazz = map.get(rootField.getName());

                                            List list = (List<?>) rootField.get(obj);

                                            Object subObj1 = clazz.newInstance();

                                            Object subObj2 = clazz.newInstance();

                                            init(subObj1, map);

                                            init(subObj2, map);

                                            list.add(subObj1);

                                            list.add(subObj2);

 

其实原理都是差不多的,1、获取属性类型,2、根据类型new一个对象,new Integer(0)、clazz.newInstance()、rootField.getType().newInstance(),3、把新对象或值设置给属性

 

以下是我以前写的一个代码,供参考

 

publicstaticvoid init(Object obj, Map<String, Class> map) {

                  try {

                          Field[] rootFields = obj.getClass().getDeclaredFields();

                          for (Field rootField : rootFields) {

                                   rootField.setAccessible(true);

                                   String rfClassName = rootField.getType().getName();

                                   if (rfClassName.equals("java.util.List")) {

                                            Class<?> clazz = map.get(rootField.getName());

                                            List list = (List<?>) rootField.get(obj);

                                            Object subObj1 = clazz.newInstance();

                                            Object subObj2 = clazz.newInstance();

                                            init(subObj1, map);

                                            init(subObj2, map);

                                            list.add(subObj1);

                                            list.add(subObj2);

                                   } elseif (rfClassName.equals("java.lang.String")) {

                                            rootField.set(obj, "");

                                   } elseif (rfClassName.equals("java.math.BigDecimal")) {

                                            rootField.set(obj, BigDecimal.ZERO);

                                   }elseif (rfClassName.equals("java.lang.Integer")) {

                                            rootField.set(obj, new Integer(0));

                                   } else {

                                            Object subObj = rootField.getType().newInstance();

                                            rootField.set(obj, subObj);

                                            init(subObj, map);

                                   }

                          }

                  } catch (Exception e) {

                  }

         }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值