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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王飞 中级黑马   /  2012-7-15 18:59  /  2022 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


import java.lang.reflect.Field;

public class DuotaiDemo {


        public static void main(String[] args) throws Exception{
               
                /*获取字节码的三种方式:
                1.类名.class
                2.对象名.getclass
                3.Class.forName(className);
                */
               
                //通过反射获取Person对象的变量值
   
                Person p1 = new Person(10,20);
               
                Field field1 = p1.getClass().getDeclaredField("x");//返回的是Person类中的字节码上变量y,  
               
                //通过field1对象获取Person的值
                System.out.println(field1.get(p1));//用field对象获取相对应--对象--的值
               
                //程序是上面这句话报的错:java.lang.IllegalAccessException这是什么东东????
                //  求帅哥赐教啊
                                
                Field field2 = p1.getClass().getDeclaredField("y");  //获取y值?
                 
                System.out.println(field2.get(p1));

        }

}

class Person
{
        private int x ;
        private int y ;

        public Person(int x, int y)
        {
                super();
                this.x = x;
                this.y = y;
        }
       
        public static void method_1()
        {
                System.out.println("hha");
        }
}

3 个回复

倒序浏览
x 是私有的
Field field1 = p1.getClass().getDeclaredField("x"); 这个只是可以看到 x 但是不能操作

再加上 field1.setAccessible(true) 就可以进行读写了

不只成员变量如此 私有 成员方法 构造器 都可以这样操作
回复 使用道具 举报
Field field1 = p1.getClass().getDeclaredField("x");  
                field1.setAccessible(true);//私有变量不能在另一类里调用,所以只能用暴力反射,强制执行
                //通过field1对象获取Person的值
                System.out.println(field1.get(p1));               
               
                                 
                Field field2 = p1.getClass().getDeclaredField("y");  
                field2.setAccessible(true);
                System.out.println(field2.get(p1));
回复 使用道具 举报
这个问题考察的是反射中的成员变量的反射。

成员变量反射的应用主要要两层:
1.变量的获取
2.变量的访问

成员变量存在于类中,因此也要遵循java的访问控制规则,分为public、default、protected和private
在成员变量反射的应用中,一般只要确定能否访问即可
示例代码:
    Person p1 = new Person(10,20);
    假设x是public的,y是private的
对于有访问权限的,应用如下:
    Field fieldX = p1.getClass().getField("x");
    System.out.println(fieldY.get(p1));
对于没有访问权限的,应用如下:
    Field fieldX = p1.getClass().getDeclaredField("x");
    fieldX.setAccessible(true);  //这个叫暴力反射
    System.out.println(fieldX.get(p1));
   

对于本例的问题,x和y都是private的,无访问权限,若要访问x和y,将用以上第二种暴力反射方式

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

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