Java反射包下的Method类中的Invoke方法

举报
JavaEdge 发表于 2021/06/04 01:34:11 2021/06/04
【摘要】 Method的invoke方法 1 先校验AccessibleObject的override字段 指示此对象是否覆盖语言级别的访问检查。初始化为“ false” 字段,方法和构造方法都会使用此字段 注意:为了安全起见,此字段在此反射包外部均不可见。 AccessibleObject是Method,Field,Constructor的父类 可调用 setAc...

Method的invoke方法

1 先校验AccessibleObject的override字段

  • 指示此对象是否覆盖语言级别的访问检查。初始化为“ false”
    字段,方法和构造方法都会使用此字段

注意:为了安全起见,此字段在此反射包外部均不可见。

AccessibleObject是Method,Field,Constructor的父类
可调用

setAccessible

方法改变,如果设置为true,则表示可以忽略访问权限的限制,直接调用。

便利方法来设置accessible标志对象的数组具有单个安全检查(效率)。
首先,如果有安全管理器,它checkPermission方法被称为一个ReflectPermission(“suppressAccessChecks”)的许可。
甲SecurityException如果升高flag是true ,但任何输入的元件中的可访问性array可以不改变(例如,如果元素对象是Constructor对象的类Class )。 在这样一个SecurityException的情况下,对象的可访问性被设置为flag数组元素高达(但不包括),用于其中发生异常的元件; 元件以外(并包括)该元素的对发生异常的可接近不变。

2 false,访问权限校验

Reflection.quickCheckMemberAccess方法先检查是不是public的

如果不是再用Reflection.getCallerClass(1)方法获得到调用这个方法的Class,然后做是否有权限访问的校验,校验之后缓存一次,以便下次如果还是这个类来调用就不用去做校验了,直接用上次的结果

3 调用MethodAccessor的invoke方法

每个Method对象包含一个root对象

  • 用于共享MethodAccessors
    此分支结构//仅当前只有两个级别深度(即一个根Method和可能指向它的许多Method对象)
    如果此分支结构曾经包含循环,则可能会发生死锁

  • root对象里持有一个MethodAccessor对象
    设置此Method对象的MethodAccessor和(递归)其根

    获得的Method对象相当于一个root的镜像,所有这些Method对象共享root里的MethodAccessor对象(这个对象由ReflectionFactory方法生成,ReflectionFactory对象在Method类中是static final的由native方法实例化)。


ReflectionFactory生成MethodAccessor

  • 如果noInflation的属性为true则直接返回MethodAccessorGenerator创建的一个MethodAccessor
  • 否则返回DelegatingMethodAccessorImpl,并将他与一个NativeMethodAccessorImpl互相引用
    但DelegatingMethodAccessorImpl执行invoke方法的时候又委托给NativeMethodAccessorImpl了

DelegatingMethodAccessorImpl

DelegatingMethodAccessorImpl 类对象就是一个代理对象,主要负责调用被代理对象 delegate 的 invoke() 方法

var1 就是控制器类
var2 就是 req 和 resp

  • 参考
    https://www.cnblogs.com/onlywujun/p/3519037.html
    https://binshao.site/2019/04/03/Reflection/

文章来源: javaedge.blog.csdn.net,作者:JavaEdge.,版权归原作者所有,如需转载,请联系作者。

原文链接:javaedge.blog.csdn.net/article/details/106552445

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。