【问题标题】:What is supposed to be passed into this method (Field#get(Object obj))?应该将什么传递给此方法(Field#get(Object obj))?
【发布时间】:2015-07-22 09:59:13
【问题描述】:
在查看了 Java 文档 here,阅读了 Oracle tutorial,以及访问了 this question here on SO 之后,我仍然对 Field#get(Object obj) 中的 Object 参数究竟是什么感到目瞪口呆。
我使用反射获取字段的过程是:
Field field = SomeClass.getClass().getDeclaredField("someField");
field.setAccessible(true);
这给出了Field 对象。现在,要获取该字段的实际值,您可以使用Field#get(Object obj) 方法。此方法的文档对参数进行了以下说明。
obj - 要从中提取表示字段值的对象
我什至不知道参数的描述是什么意思。有人可以向我解释这个论点的真正要求吗?
谢谢。
【问题讨论】:
标签:
java
oracle
reflection
field
【解决方案1】:
假设你有一个班级Foo:
public class Foo {
public int bar;
}
现在你可以拥有这个类的多个实例:
Foo f1 = new Foo();
f1.bar = 1;
Foo f2 = new Foo();
f2.bar = 2;
要反射性地获取f1 的字段bar 的值,您可以调用
field.get(f1); // returns 1
要反射性地获取f2 的字段bar 的值,您可以调用
field.get(f2); // returns 2
【解决方案2】:
尝试运行此代码:
import java.lang.reflect.Field;
public class TestReflect
{
private int value;
public static void main ( String[] args) throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException
{
Field field = TestReflect.class.getDeclaredField("value");
TestReflect objRed = new TestReflect();
TestReflect objBlue = new TestReflect();
objRed.value = 1;
objBlue.value = 2;
System.out.println( field.get(objRed) );
System.out.println( field.get(objBlue) );
}
}
你会得到输出:
1
2
field 变量引用了 TestReflect 类中的变量 value。但是value 是instance variable,所以TestReflect 类的每个对象都有自己的value 变量。要获取 value 变量,您需要指定从哪个对象获取它,这就是参数的用途。