应该传递给这个方法的内容(Field#get(Object obj))



在看了这里的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;

要反射地获得f1bar字段的值,您可以调用

field.get(f1); // returns 1

要反射地获得f2bar字段的值,您可以调用

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变量,您需要指定从哪个对象获取它,这就是参数的作用。

相关内容

  • 没有找到相关文章

最新更新