在看了这里的Java文档,阅读了Oracle教程,以及在SO上访问了这个问题之后,我仍然对Field#get(Object obj)
中的Object
参数实际上是什么感到困惑。
我使用反射获取字段的过程是:
Field field = SomeClass.getClass().getDeclaredField("someField");
field.setAccessible(true);
给出Field
对象。现在,要获得字段的实际值,可以使用Field#get(Object obj)
方法。该方法的文档中有如下关于参数的说明:
obj -要从中提取所表示字段值的对象
我甚至不知道参数的描述是什么意思。有人能给我解释一下这个论点到底在要求什么吗?
谢谢。
假设您有一个类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
试着运行下面的代码:
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
是一个实例变量,所以类TestReflect
的每个对象都有自己的value
变量。要获得value
变量,您需要指定从哪个对象获取它,这就是参数的作用。