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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 袁野 黑马帝   /  2012-4-2 23:34  /  2522 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.heima.day1;

import java.lang.reflect.Field;

public class ReflectTextTwo {
        private int x;
        public int y;

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

        public static void main(String[] args) throws Exception {
                ReflectTextTwo rt1 = new ReflectTextTwo(3, 5);
                Field fdy = rt1.getClass().getField("y");
//                fdY的值是5么? 不是,因为 获取的是字节码而不是对象上的变量 是类上的
//                要用他去取对应对象的值
                System.out.println(fdy.get(rt1));
/*                Field fdx = rt1.getClass().getField("x");
                 // ava.lang.NoSuchFieldException: x        因为x是私有的所以不可以直接的获得       
//                该如何解决那。。。?
*/
                Field fdx = rt1.getClass().getDeclaredField("x");
//                fdx.setAccessible(true); //设置可以被获取
                System.out.println(fdx.get(rt1));
               
               
        }

fdx.setAccessible(true);  这个代码我注释了 依然可以获取到私有变量的值。。和视频里的那个异常并没有出现,求解释

8 个回复

倒序浏览
如果没看错你是不是把,私有字段类和反射写在一个类里了?那就不用设置访问权限为true,也不会抛出异常
回复 使用道具 举报
请比对张老师的程序,你就知道为什么了。
  1. 01.class ReflectPoint {  
  2. 02.    private int x;  
  3. 03.    public int y;  
  4. 04.    public ReflectPoint(int x, int y) {  
  5. 05.        this.x = x;  
  6. 06.        this.y = y;  
  7. 07.    }  
  8. 08.}  
  9. 09.public class ReflectDemo {  
  10. 10.    public static void main(String[] args) throws Exception {  
  11. 11.        ReflectPoint pt1 = new ReflectPoint(3, 5);  
  12. 12.        Field fieldY = pt1.getClass().getField("y");  
  13. 13.        System.out.println(fieldY.get(pt1));  
  14. 14.        Field fieldX = pt1.getClass().getDeclaredField("x");  
  15. 15.        fieldX.setAccessible(true);  
  16. 16.        System.out.println(fieldX.get(pt1));  
  17. 17.    }  
  18. 18.}  
复制代码
回复 使用道具 举报
写一个类里面了   成员变量  被成员方法访问 就不存在私有非私有哦   
回复 使用道具 举报
本帖最后由 格式化 于 2012-4-3 00:49 编辑

反射获取字节码文件对象的三种方式
       1、通过Object中的getClass方法获取
      特点:必须要创建指定类的对象,再用该对象调用getclass()方法来完成获取。
     2、通过一个具体类型的举得class静态属性就可以完成该类型class对象的获取
      特点:必须要明确数据类型比如Person
     3、使用class类中的方法,foeName就可以完成class对象的获取
     特点:不需要知道具体类型,只要知道名字,就会根据名称去加载指定的类文件。

  Field fdx = rt1.getClass().getDeclaredField("x");
//                fdx.setAccessible(true); //设置可以被获取
                System.out.println(fdx.get(rt1));
         fdx.setAccessible(true); 是取消对权限的检查,称为暴力访问。无论你是受保护的还是私有以及final修饰我都可以进行访问。
        你已经通过Object中的已经获取到了本类中的对象,而getDeclaredField这个方法能都拿到本类中公有和私有的字段值,所以不会出现异常。
     如果你将getClass方法去掉,直接用getDeclaredField这个方法获取就会出现IllegalAccessException,这样才会出现无效访问异常,这时你不通过getClass方法访问,必须
    通过fdx.setAccessible(true); 进行暴力访问,不然就会出现无效访问异常。
     
回复 使用道具 举报
格式化 发表于 2012-4-3 00:48
反射获取字节码文件对象的三种方式
       1、通过Object中的getClass方法获取
      特点:必须要创建指 ...

谢谢 我测试了下 解决了
回复 使用道具 举报
袁野 黑马帝 2012-4-3 09:49:52
7#
贠(yun)靖 发表于 2012-4-3 00:29
写一个类里面了   成员变量  被成员方法访问 就不存在私有非私有哦

谢谢 我测试了下 解决了  
回复 使用道具 举报
袁野 黑马帝 2012-4-3 09:50:42
8#
郑涛 发表于 2012-4-2 23:47
如果没看错你是不是把,私有字段类和反射写在一个类里了?那就不用设置访问权限为true,也不会抛出异常 ...

谢谢 问题得到解决了
回复 使用道具 举报
袁野 黑马帝 2012-4-3 09:51:13
9#
姚鑫 发表于 2012-4-3 00:00
请比对张老师的程序,你就知道为什么了。

谢谢了 问题得到了解决了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马