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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何清林 中级黑马   /  2014-3-1 23:46  /  797 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

什么是暴力反射?

评分

参与人数 1黑马币 +5 收起 理由
何伟超 + 5

查看全部评分

1 个回复

倒序浏览
暴力反射实质上还是反射,只不过它可以突破类访问权限的控制。就是通过java.lang.reflect 中的AccessibleObject类中的setAccessible方法。
         请看如下代码:(选自张孝祥老师的java高级技术中的第20讲:成员变量的反射)
class ReflectPoint
{
    private int x;
    private int y;
    ReflectPoint(int x,int y)
   {
         this.x = x;
         this.y = y;
    }
}
import java.lang.reflect.*;

public class reflect {

        /**
         * @param args
         * @throws NoSuchFieldException
         * @throws SecurityException
         * @throws IllegalAccessException
         * @throws IllegalArgumentException
         */
        public static void main(String[] args) throws SecurityException,
                        NoSuchFieldException, IllegalArgumentException,
                        IllegalAccessException {
                // TODO Auto-generated method stub

                ReflectPoint rp = new ReflectPoint(3, 5);
                Field fieldY = rp.getClass().getDeclaredField("y");

                fieldY.setAccessible(true);//本来通过正常反射是不能获取到私有成员的,但是setAccessible方法设置为true值,值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。所以,可以获取到该类的私有成员


                System.out.println(fieldY.get(rp));

        }

}
选自JDK API 1.6:
public void setAccessible(boolean flag)
                   throws SecurityException将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。

JAVA的封装是通过private实现的,私有成员可以通过get(),set()方法访问,但是以上反射机制破坏了这项规则,能访问到该类本来不想暴露的私有成员,所以叫暴力反射。

评分

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

查看全部评分

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