Java 拓展读物 反射机制 03 类内属性的处理
作者:谎言诞行    发布时间:2025年02月15日

这里我们将展开讲述Java中如何通过反射机制动态设置、获取一个对象的类内属性。在开始之前,我们先看看测试类中的类内属性定义。如下图:

image.png

通过上图,我们可以看出,类内部有5个不同的属性。如果按照性质区分,大体如下:

(1)公有静态属性

(2)私有静态属性

(3)私有普通属性2个

(4)公有普通属性1个

在常规的程序中,公有属性在外部程序是可以访问,也就可以调用。而私有属性,外部程序不可访问,也就不能调用。一般来说,为了能访问私有属性,我们可以按照Java Bean的标准,设置2种处理方法:getter 和 setter 方法。如下图:

image.png

由于getter 和 setter 方法是公共的,所以外部程序,可以通过getter 和 setter 方法来读、写对象内部的私有属性值。

然而,在反射机制中,我们可以突破语法限制,直接读、写私有属性值。至于公有的属性,那是肯定可以读、写的。

常规调用

在开始使用反射之前,我们先看看常规的写法如何读、写类和对象内部的属性。

image.png

这里我们再通过代码提示,看看私有属性是否可以查看到

image.png

反射调用

下面我们展示如何使用反射读、写类内属性的值。主要分为2个部分:普通属性的读写 以及 静态属性的读写。

image.png

通过上面的代码,大家应该已经看出,如何通过反射读写类和对象的内部属性了。当中有几点还是需要说明一下:

(1)获取类的Class对象,除了通过Class.forName方法之外,还可以通过已有对象的getClass方法获取。

(2)获取属性Field对象,需要通过getDeclaredField 方法才可以获取所有的属性。getField 方法只能获取到公共的属性。

(3)读、写类和对象的属性时,对于私有属性需要先将可访问性设置为true值。读取值通过Field对象的get方法处理。写入值通过Field对象的set方法处理(对于set方法,如果所定义的方法有参数,则调用时需要带上对应的参数)

(4)Field对象的get、set方法都需要传入一个object参数,它就是要操作的具体对象。如果操作的是类内部定义的静态属性,object参数传入null值即可。

注意:

在反射处理上,连私有的属性都可以直接读、写。那么对于静态的属性,能否修改它的值呢?比如:将 MY_CONST_1 的值修改为其它值。示例如下:

image.png

通过上面的截图,我们可以看到,get方法获取属性值是没问题的。但是,set方法修改值是不可行的

最后,我们讲下关于反射机制使用中,可能发生的异常。(在测试代码中,为了代码简洁,没有对异常捕捉处理,只是简单地抛出)

(1)NoSuchFieldException - 如果未找到具有指定名称的字段(属性)。

(2)NullPointerException - 如果属性名 为 null;如果指定的对象为 null 且字段为实例字段。

(3)IllegalAccessException - 如果此 Field 对象在执行 Java 语言访问控制,并且底层字段不可访问或为 final 类型。

(4)IllegalArgumentException - 如果指定的对象不是声明底层字段的类或接口(或其子类或实现类)的实例,或者如果解包转换失败。

(5)ExceptionInInitializerError - 如果此方法引发的初始化失败。

(6)SecurityException - 如果请求被拒绝。

另外,如何获取所有的属性对象。我们可以按照以下的方式来处理:

image.png


本节结束

填写一种颜色的字符(不区分大小写),1分钟有效,点击图片刷新