1

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

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

我所理解的是,它使用反射 API 设置 AbcClass.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。

但在我的测试用例中,它没有抛出任何空指针异常

我试着在谷歌上搜索这个 api 的更多示例用法,没有找到任何有用的示例,可能更多示例可以帮助我更好地理解。

4

2 回答 2

2

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

于 2013-06-06T06:15:54.707 回答
1

我能想象的原因是这个。

您获取该字段的方式不知道它所属的实例。在静态字段中很好,因为静态使字段属于类并且可以在没有实例化对象的情况下独立存在。

但是一个非静态字段需要一个实例化的对象才能存在。导致 set 方法需要知道该实例是什么。

于 2013-06-06T06:24:27.697 回答