黑马程序员技术交流社区

标题: 反射中打印私有变量的问题 [打印本页]

作者: 匿名    时间: 2011-8-31 23:44
呵呵,你这样写就是可以打印出3啊,你是在同一个类中访问private类型的变量x当然是可以的,private访问权限就是在同一个类中才可见。写在两个类中就不可见了。代码如下:
package heima.reflect.test;

import java.lang.reflect.Field;

class ReflectPoint {
        private int x;
        int y;

        public ReflectPoint(int x, int y) {
                this.x = x;
                this.y = y;
        }
}

public class ReflectPointTest {
        public static void main(String[] args) throws Exception {
                ReflectPoint pt1 = new ReflectPoint(3, 5);
                Field fieldX = pt1.getClass().getDeclaredField("x");
                // Field fieldX=pt1.getClass().getField("x");
                                           [color=Red]// fieldX.setAccessible(true);[/color]       
                                     System.out.println(fieldX.get(pt1));
        }
}

             执行时报错:
Exception in thread "main" java.lang.IllegalAccessException: Class heima.reflect.test.ReflectPointTest can not access a member of class heima.reflect.test.ReflectPoint with modifiers "private"
        at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
        at java.lang.reflect.Field.doSecurityCheck(Unknown Source)
        at java.lang.reflect.Field.getFieldAccessor(Unknown Source)
        at java.lang.reflect.Field.get(Unknown Source)
        at heima.reflect.test.ReflectPointTest.main(ReflectPointTest.java:21)

   加上红色那句就能打印出3了。并不是什么1.7的新特性,估计你用的也不是1.7的jdk.
作者: 匿名    时间: 2011-9-1 00:10
呵呵,就是我也一样有时候就楞了。。。
作者: 郝妮娜    时间: 2011-9-1 12:28
张老师在“面向对象下”中的访问控制已经讲过了,你可以看看

                  private  defalut    protected  public
同一类            可以        可以         可以       可以
同一包中的类                 可以         可以       可以
子类                                                可以      可以
其它包中的类                                  可以      可以
[ 本帖最后由 郝妮娜 于 2011-09-01  12:31 编辑 ]




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