【问题标题】: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。但是valueinstance variable,所以TestReflect 类的每个对象都有自己的value 变量。要获取 value 变量,您需要指定从哪个对象获取它,这就是参数的用途。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多