通过反射修改对象属性

public static void main(String[] args) throws Exception  {
    String str="reject.Person";
    try {
        /**
         * 通过反射调取方法修改参数,应用场景比较多
         */
        //获取反射对象
        Class name = Class.forName(str);
        //获取实例,因为newInstance方法得到的是object类型的,所以需要强转
        Person instance = (Person) name.newInstance();
        //instance.setName("高淇");
        //通过反射对象获取一般方法
        Method method = name.getMethod("setName", String.class);
        //利用反射中的invoke方法激活通过反射调取的方法,里面的参数是实例对象和方法参数
        method.invoke(instance, "高淇");
        System.out.println(instance.getName());
        /**
         * 通过反射调取属性,修改属性参数。
         */
        //通过反射获取反射对象
        Class name1 = Class.forName(str);
        //通过反射获取某个声明的属性
        Field declaredField = name1.getDeclaredField("name");
        //一般属性私有化,通过setAccessible方法,可以免去安全访问环节,对象可以直接访问。
        declaredField.setAccessible(true);
        //通过set方法,修改属性,里面的参数是实例对象和修改后的参数。
        declaredField.set(instance, "gaoqi");
        System.out.println(instance.getName());


    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

案例

//将JsonArry转换为list
                 List list=JSONObject.parseArray(jsonArray.toString(),UserMFlowDetail.class);
                 WaterUser waterUser=waterUserMag.getObjectById(dbUserMFlow.getPeriod());
                 Class name = Class.forName("com.centit.njjs.yshgl.po.WaterUser");
                 list.forEach(item->{
                     try {
                         Field declaredField = name.getDeclaredField(item.getModifiedField());
                         declaredField.setAccessible(true);
                         if("chargeType".equals(item.getModifiedField())){//判断list集合下遍历对象的属性:是否是chargeType
                             declaredField.set(waterUser, "2");
                         }else{
                             declaredField.set(waterUser, item.getNewCon());
                         }
                     } catch (NoSuchFieldException e) {
                     //NoSuchFieldException错误是由于没有对应字段造成的,或者当属性为私有时获取Field用的方法不是getDeclaredField
                         e.printStackTrace();
                     } catch (IllegalAccessException e) {
                         e.printStackTrace();
                     }
                     waterUserMag.mergeObject(waterUser);//保存对象
                 });

你可能感兴趣的:(JAVA,java,反射,类)