A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周万谋 中级黑马   /  2012-10-26 18:33  /  1214 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 周万谋 于 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,那该字段也必须是静态的么?

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

1 个回复

倒序浏览
本帖最后由 冯纪纲 于 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,不然编译器会报错。

        }

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马