使用spring reflectionutils

r1zhe5dt  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(374)

我不完全理解下面代码的最后一行

Field init = ReflectionUtils.findField(ABCClass.class, "init");
 ReflectionUtils.makeAccessible(init);
 init.set(null, false);

我所知道的是,它使用反射api设置class.init=false。我不明白的是为什么我们没有这样的二传手

set(Object value) // looks logical as we have reference to field , we can simply set the value

但事实上我们有

set(Object obj,Object value)

我看了api文档http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/field.html#set(java.lang.object,java.lang.object)它说
如果基础字段是静态的,则忽略obj参数;可能为空。
否则,基础字段是示例字段。如果指定的对象参数为null,则该方法将抛出nullpointerexception。
但在我的测试用例中,它不会抛出任何空指针异常
我在google上搜索了更多这个api的用法示例,没有找到任何有用的示例,可能更多的示例可以帮助我更好的理解。

rjee0c15

rjee0c151#

init 是class上的静态方法。如文档所述,如果基础字段是静态的,则忽略第一个参数;可能为空。

kzipqqlq

kzipqqlq2#

我能想象的原因是这样的。
获取字段的方式不知道它所属的示例。在静态字段中,这很好,因为静态使字段属于类,并且可以独立存在,而不需要示例化对象。
但非静态字段需要示例化对象才能存在。导致set方法需要知道该示例是什么。

相关问题