黑马程序员技术交流社区

标题: 为什么用getDeclaredField方法不能获得private对象 [打印本页]

作者: 杨朔    时间: 2012-7-2 21:32
标题: 为什么用getDeclaredField方法不能获得private对象
本帖最后由 杨朔 于 2012-7-4 19:50 编辑

两个程序第一个
public class TheOne {

        private String s1="ball";
        public String s2="bastball";
        
        TheOne(){
               
        }

}
第二个

import java.lang.reflect.Field;


public class Two {

        
        public static void main(String[] args) throws Exception {
                TheOne to=new TheOne();
                change(to);
                System.out.println(to);
               
        }
        public static void change(Object obj) throws Exception{
               
                Field[] field = obj.getClass().getDeclaredFields();
                for(Field fi:field){
                        
                        if(fi.getType()==String.class){
                                String s1=(String) fi.get(obj);
                                System.out.println("s1");
                        }
                }
               
        }

}
一直提示java.lang.IllegalAccessException: Class Two can not access a member of class TheOne with modifiers "private"这是为什么
作者: 黑马-王言龙    时间: 2012-7-2 21:40
私有成员,在别的类里无法调用,只在本类可以访问
作者: 薄炳鑫    时间: 2012-7-2 21:54
本帖最后由 薄炳鑫 于 2012-7-2 22:07 编辑

你这就是想要用暴力反射。
对私有字段的反射,但是你少加了一句话fi.setAccessible(true);在for循环里面加上这句话就可以了。
将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。
作者: 周朋飞    时间: 2012-7-2 23:39
这也是反射的一种应用,其实没多大用处 只是帮你了解反射,张老师讲过,这就好像 你和另外一个人,然后呢 另外一个人的私有的钱你是看不到的,但是你用了getDeclaredFields方法那么这就好比说 他穿了一件透明的裤子,咦你说这里面有钱,你看到了,但是呢 你就是不能去取,这人也太坏了是吧,故意给你显摆说我有钱你就是拿不到,但是你有办法啊,什么办法 setAcces的值设为true啊 这不就能获取到了  是吧 ,都有方法的兄弟




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