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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小骗子 中级黑马   /  2013-12-20 13:15  /  997 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在同一个包下,创建2个类
Test1
public class Test1  {

private int x;
protected   int y;
  public Test1(int x,int y)
  {
   super();
   this.x=x;
   this.y=y;
  }
}

Test2
public class Test2{
public static void main(String[] args) throws Exception{
Test1 point=new Test1(3,5);
  Field filedY=point.getClass().getField("y");
  System.out.println(filedY.get(point));
}
}

为什么不能通过反射取到变量y,这不是同一个包下,protected权限是足够的?

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

1 个回复

倒序浏览
并不是这个原因,不在同一个包中也是可以访问的,你的确是先取得了字节码,在取字段,只不过在去取字段的时候,建议你看看APi,point.getClass().getField("y");,它反映此 Class 对象所表示的类或接口的指定公共成员字段,也就是说是public修饰的,如果要想取到private或者别的访问权限,就得使用Field getDeclaredField(String name)   返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。 ,这样你就可以访问包了,但是光这一步还是不行的,在filedY.get(point)之前你还得声明一下fieldY.setAccessible(true);告诉编译器编译时不需要权限就可以访问。希望能帮到你吧,打字不容易!

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

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