黑马程序员技术交流社区

标题: 反射的一点小问题。 [打印本页]

作者: 孙浩迪    时间: 2012-6-23 16:30
标题: 反射的一点小问题。
本帖最后由 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;
        }
        
        
}

看注释, 不明白什么情况,检查半天,一模一样啊
作者: 闾丘日月    时间: 2012-6-23 16:36
Field filedx   = p.getClass().getField("x");
filedx.setAccessable(true);
...........
你的成员变量是私有的,要更改访问权限,听课要听全,张老师这么做的时候person的x应该是公有的。

作者: 李盼    时间: 2012-6-23 16:39
//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:43
字段权限设置为了私有  调用的方法错误
作者: 孙峰    时间: 2012-6-23 16:49

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

作者: 陈嘉宾    时间: 2012-6-23 17:11

本帖最后由 陈嘉宾 于 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




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