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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何竹冬 中级黑马   /  2013-1-4 19:34  /  1319 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何竹冬 于 2013-1-6 13:47 编辑

张孝祥老师是在讲反射Field的时候说到暴力反射可以获取私有变量的值,那能不能修改私有变量的值呢 ?

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1

查看全部评分

3 个回复

倒序浏览
可以啊,既然你可以得到,对应的也能设置。在学习的时候,不知道的要大胆想象,然后查api

评分

参与人数 1黑马币 +30 收起 理由
李培根 + 30 赞一个

查看全部评分

回复 使用道具 举报
Field 类有一个set方法。就是设置字段值的方法。

评分

参与人数 1黑马币 +30 收起 理由
李培根 + 30 赞一个

查看全部评分

回复 使用道具 举报

import java.lang.reflect.Field;


public class Test0 {

        /**
         * @param args
         * @throws SecurityException
         * @throws NoSuchFieldException
         */
        public static void main(String[] args) throws Exception {
                // TODO Auto-generated method stub
                Test23 pt1=new Test23(3,5);
                //fieldY不代表一个具体的值,每个对象上都可以有fieldY,要用gat方法获取某个对象的值才行
                Field fieldY=pt1.getClass().getField("y");
                System.out.println(fieldY.get(pt1));
                //上面的方法只能获取共有的变量,下面的方法可以用于取出私有变量,暴力反射
                Field fieldX=pt1.getClass().getDeclaredField("x");
                fieldX.setAccessible(true);
                System.out.println(fieldX.get(pt1));//打印得到的值
                fieldX.setInt(pt1, 88);//设置得到的私有变量的值
                System.out.println(fieldX.get(pt1));//再次打印修改后的值
        }

}
class Test23 {
        private int x;
        public int y;
        public Test23(int x, int y) {
                super();
                this.x = x;
                this.y = y;
        }
}
试试吧,可以的,学习java有想法,只要多动手试试就会找到结果的。

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个

查看全部评分

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