应该将什么传递给此方法 (Field#get(Object obj))?

What is supposed to be passed into this method (Field#get(Object obj))?

看了 Java 文档 here, and reading an Oracle tutorial, as well as visiting 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 - object from which the represented field's value is to be extracted

我什至不知道参数的描述是什么意思。有人可以向我解释一下这个论点真正要求的是什么吗?

谢谢。

假设你有一个 class Foo:

public class Foo {
    public int bar;
}

现在您可以拥有多个实例 class:

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 变量引用 class TestReflect 中的变量 value。但是 value 是一个 instance variable 所以 class TestReflect 的每个对象都有自己的 value 变量。要获取 value 变量,您需要指定从哪个对象获取它,这就是参数的用途。