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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙浩迪 中级黑马   /  2012-6-23 16:30  /  1414 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 sunhaodi 于 2012-6-23 22:38 编辑

import java.lang.reflect.Field;

public class ReflectDemo {

          public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
               
                  Person p = new Person(3,4);
                  
                    Field filedx   = p.getClass().getField("x");
                    
                    System.out.println(filedx.get(p)); //这个代码我和张孝祥老师写的一样, 为什么运行不出来会报错啊
                  
                  
//                       Field filedy= p.getClass().getDeclaredField("y");
                       
//                       filedy.setAccessible(true);
                       
//                       System.out.println(filedy.get(p));
        }
         
         
         
        
}

class Person{
        
        private int x;
        private int y;
        
        private String  str1 = "aaaaaaa";
        private String  str2 ="ddddddd";
        public Person(int x, int y) {
                super();
                this.x = x;
                this.y = y;
        }
        
        
        
        @Override
        public String toString() {
                // TODO Auto-generated method stub
                return str1+".............."+str2;
        }
        
        
}

看注释, 不明白什么情况,检查半天,一模一样啊

5 个回复

倒序浏览
Field filedx   = p.getClass().getField("x");
filedx.setAccessable(true);
...........
你的成员变量是私有的,要更改访问权限,听课要听全,张老师这么做的时候person的x应该是公有的。
回复 使用道具 举报
//Field filedx   = p.getClass().getField("x");  x是私有字段,这个方法无法获得,要用我下面的方法获得,并且把这个字段的访问权限取消!
Field filedx   = p.getClass().getDeclaredField("x");
filedx.setAccessible(true);
              
System.out.println(filedx.get(p));

点评

正解~~  发表于 2012-6-23 16:42
回复 使用道具 举报
字段权限设置为了私有  调用的方法错误
回复 使用道具 举报

class Person{
        
        private int x;
        private int y;
        你这里 的x  和  y 都是私有啊,按你注释掉的方法,只有y能被暴力访问。  张老师的例子中 x是私有, y是公有的。你再仔细听听就知道了。
回复 使用道具 举报

本帖最后由 陈嘉宾 于 2012-6-23 17:02 编辑


class Person{
        
        private int x;
        private int y;
        
        private String  str1 = "aaaaaaa";
        private String  str2 ="ddddddd";
        public Person(int x, int y) {
                super();
                this.x = x;
                this.y = y;
        }
        
        
        
        @Override
        public String toString() {
                // TODO Auto-generated method stub
                return str1+".............."+str2;
        }
        
        
}
这里是私有的所以要用爆力反射,所以你第一个打印不出来用暴力反射的方法public String  str1 = "aaaaaaa";        public String  str2 ="ddddddd";这里你改成私有的当然访问不到了,改成public
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马