【Java反射(一)】获取及设置属性值

目录

背景

获取属性值

设置属性值

完整代码

参考


背景

反射说起来还是上学时候刚学java基础的时候写过单测,之后就再也没用过了,全还给老师了。最近在项目里遇到了一个场景,需要对多个类的相同字段进行相同的逻辑处理,而这些类有些已经继承了其他父类了。略一思考,封装一个方法,入参是Objec,通过反射获取相同的字段,进行业务逻辑处理。听起来是个可行方案,然后我就踩坑了,over。

获取属性值

getDeclaredField(String name)获取name字段,public和protected和private,不包括父类字段
getField(String name)获取name字段,public,包括父类字段

非常巧,我要获取父类private的字段,怎么搞呢?获取字段之前先调用下面的方法就好了!

getSuperclass()获取父类                                      

可以拿到属性字段了,下面获取 属性值

setAccessible(true)如果属性是private,先设置属性可操作权限
get(obj)获取属性值

设置属性值

setAccessible(true)如果属性是private,先设置属性可操作权限
set(Object obj, Object value)obj属性字段,value 要设置的值

完整代码

    public void getAndSetFieldValue(Object request) {
        try {

            Class requestClass = request.getClass();
            //1. 获取属性值
            Field departIdField = null;
            //1.1 获取属性字段
            try {
                departIdField = requestClass.getDeclaredField("departId");

            } catch (NoSuchFieldException e) {
                departIdField = requestClass.getSuperclass().getDeclaredField("departId");
            }
            //1.2 获取属性值
            departIdField.setAccessible(true);
            Object departIdValueObj = departIdField.get(request);

            //2. 设置属性值
            Field officeCodeListField = null;
            //2.1 获取属性字段
            try {
                officeCodeListField = requestClass.getDeclaredField("officeOrgCodeList");
            } catch (Exception e) {
                officeCodeListField = requestClass.getSuperclass().getDeclaredField("officeOrgCodeList");
            }
            //2.3 设置属性值
            officeCodeListField.setAccessible(true);
            officeCodeListField.set(request, Arrays.asList("123", "456"));

        } catch (Exception e) {
            // 异常处理
        }
    }

参考

反射得到父类私有字段并且赋值

Java-Reflection反射-获取包括父类在内的所有字段

利用java反射获取和设置属性值

反射是否真的会让你的程序性能降低?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java反射是指在程序运行的时候,通过特定的API来检查或修改程序的状态、能力和内部属性等,而这些在正常情况下是无法通过编译时检查来完成的。例如,通过反射机制,我们可以获取一个对象的类型信息并调用其方法、访问它的属性,以及创建一个新对象等。 反射获取对象属性,首先需要通过Class类的forName()方法来获取对象的Class实例。然后通过Class类的getDeclaredField()方法获取对象属性的Field对象,再通过Field对象的get()方法来获取属性。如果需要获取私有属性,则需要通过setAccessible(true)方法来取消Java语言的访问检查机制,以允许获取私有属性。 例如,假设有一个Person类,其中包含有一个private String name属性,现在需要获取属性,可以使用反射机制进行如下操作: ``` Class<?> clazz = Person.class; Object obj = clazz.newInstance(); Field field = clazz.getDeclaredField("name"); field.setAccessible(true); String nameValue = (String) field.get(obj); ``` 通过以上代码,我们可以获取Person对象的name属性,并将其赋给nameValue变量中。 需要注意的是,反射机制虽然功能强大,但由于它会在运行时改变程序的状态和能力,因此会带来诸多安全性和性能上的问题,尤其是容易引起类型转换异常和内存泄漏等问题,因此在使用反射机制时要谨慎操作,避免不必要的风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值