打字猴:1.700447774e+09
1700447774
1700447775 Accessible=false
1700447776
1700447777 Do Stuff……
1700447778
1700447779 为什么Accessible属性会等于false?而且等于false了还能执行?这是因为Accessible的属性并不是我们语法层级理解的访问权限,而是指是否更容易获得,是否进行安全检查。
1700447780
1700447781 我们知道,动态修改一个类或方法或执行方法时都会受Java安全体系的制约,而安全的处理是非常消耗资源的(性能非常低),因此对于运行期要执行的方法或要修改的属性就提供了Accessible可选项:由开发者决定是否要逃避安全体系的检查。
1700447782
1700447783 阅读源代码是理解的最好方式,我们来看AccessibleObject类的源代码,它提供了取消默认访问控制检查的功能。首先查看isAccessible方法,代码如下:
1700447784
1700447785 public class AccessibleObject implements AnnotatedElement{
1700447786
1700447787 //定义反射的默认操作权限:suppressAccessChecks
1700447788
1700447789 static final private java.security.Permission ACCESS_PERMISSION=new Reflect-
1700447790
1700447791 Permission(“suppressAccessChecks”);
1700447792
1700447793 //是否重置了安全检查,默认是false
1700447794
1700447795 boolean override;
1700447796
1700447797 //默认构造函数
1700447798
1700447799 protected AccessibleObject(){}
1700447800
1700447801 //是否可以快速获取,默认是不能
1700447802
1700447803 public boolean isAccessible(){
1700447804
1700447805 return override;
1700447806
1700447807 }
1700447808
1700447809 }
1700447810
1700447811 AccessibleObject是Field、Method、Constructor的父类,决定其是否可以快速访问而不进行访问控制检查,在AccessibleObject类中是以override变量保存该值的,但是具体是否快速执行是在Method类的invoke方法中决定的,代码如下:
1700447812
1700447813 public Object invoke(Object obj, Object……args)throws……{
1700447814
1700447815 //检查是否可以快速获取,其值是父类AccessibleObject的override变量
1700447816
1700447817 if(!override){
1700447818
1700447819 //不能快速获取,要进行安全检查
1700447820
1700447821 if(!Reflection.quickCheckMemberAccess(……){
1700447822
1700447823 ……
[ 上一页 ]  [ :1.700447774e+09 ]  [ 下一页 ]