暴力反射实质上还是反射,只不过它可以突破类访问权限的控制。就是通过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()方法访问,但是以上反射机制破坏了这项规则,能访问到该类本来不想暴露的私有成员,所以叫暴力反射。
|