使用Spring ReflectionUtils

时间:2013-06-06 06:07:56

标签: java spring

我没有完全了解下面一段代码中的最后一行

 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的更多示例用法,没有找到任何有用的示例,可能会有更多示例可以帮助我更好地理解。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我能想象的原因是这个。

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

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