黑马程序员技术交流社区

标题: 反射字段中纠结的问题 [打印本页]

作者: 周万谋    时间: 2012-10-26 18:33
标题: 反射字段中纠结的问题
本帖最后由 周万谋 于 2012-10-28 15:16 编辑

在反射方法中我们是通过
  1. 1,Constructor con = String.class.getConstructor(String.class);
  2. 2, String str = (String)con.newInstance("hei ma");
  3. 3,Method method = String.class.getMethod("charAt",int.class ); //通过类名.class拿到String类的字节码,再获得某个方法
  4. 4,method.invoke(str, new Object[]{1}); // 再从获得的方法调用invoke("指定对象","参数值"),就可以为该方法赋值取值等操作
复制代码
其中第4步的 str  可以为null,那就代表该方法是静态的。
问题是:如果反射字段上的指定对象也为null,那该字段也必须是静态的么?
作者: 冯纪纲    时间: 2012-10-26 19:36
本帖最后由 冯纪纲 于 2012-10-26 19:37 编辑

反射字段的时候要注意了,如果是静态属性的话,在反射后调用其set(Object obj, Object value)方法的时候,这时的obj可以是指定的对象,也可以为空。但是在反射后调用其get方法的时候,如getInt(Object obj) ,这时的obj不能为空,尽管这个属性是static的。我做了个试验。如下:
class Person
{
private static int grade = 99;
}

@Test
        public void test3() throws Exception {
                Person p = new Person();
                Class c = Class.forName("Person");
                Field f = c.getDeclaredField("grade");// 通过得到定义的字段。
                f.setAccessible(true);
                f.set(p, 24);//这里的p可以为null,也可以为指定的对象p。
                System.out.println(f.getInt(p));//这里调用getInt()时,必须为其其指定对象p,不然编译器会报错。

        }






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2