打字猴:1.700447796e+09
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 ……
1700447824
1700447825 Reflection.ensureMemberAccess(……);
1700447826
1700447827 ……
1700447828
1700447829 }
1700447830
1700447831 }
1700447832
1700447833 //直接执行方法
1700447834
1700447835 return methodAccessor.invoke(obj, args);
1700447836
1700447837 }
1700447838
1700447839 看了这段代码,诸位就很清楚了:Accessible属性只是用来判断是否需要进行安全检查的,如果不需要则直接执行,这就可以大幅度地提升系统性能(当然了,由于取消了安全检查,也可以运行private方法、访问private私有属性了)。经过测试,在大量的反射情况下,设置Accessible为true可以提升性能20倍以上。
1700447840
1700447841 AccessibleObject的其他两个子类Field和Constructor与Method的情形相似:Accessible属性决定Field和Constructor是否受访问控制检查。我们在设置Field或执行Constructor时,务必要设置Accessible为true,这并不仅仅是因为操作习惯的问题,还是在为我们系统的性能考虑。
1700447842
1700447843 注意 对于我们已经“习惯”了的代码,多思考一下为什么。
1700447844
1700447845
[ 上一页 ]  [ :1.700447796e+09 ]  [ 下一页 ]