我没有完全了解下面一段代码中的最后一行
Field init = ReflectionUtils.findField(ABCClass.class, "init");
ReflectionUtils.makeAccessible(init);
init.set(null, false);
我的理解是它使用Reflection 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 doc http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Field.html#set(java.lang.Object,java.lang.Object) 它说
如果底层字段是静态的,则忽略obj参数;有可能 是空的。
否则,基础字段是实例字段。如果指定的话 object参数为null,该方法抛出NullPointerException。
但是在我的测试用例中它没有抛出任何空指针异常
我尝试使用google搜索这个api的更多示例用法,没有找到任何有用的示例,可能会有更多示例可以帮助我更好地理解。
答案 0 :(得分:2)
init
是ABCClass上的静态方法。正如文档所说,如果底层字段是静态的,则忽略第一个参数;它可能是空的。
答案 1 :(得分:1)
我能想象的原因是这个。
您获取该字段的方式不知道它所属的实例。在静态字段中很好,因为静态使得字段属于类,并且可以独立存在而不需要实例化对象。
但非静态字段需要存在实例化对象。导致set方法需要知道该实例是什么。