Method的invoke方法初步了解

2023-11-14

Java调试过程中,我们有时候会需要对JVM运行过程中哪出了问题进行调试,先从最基础的了解。

 

我们都知道Java框架中方法的调用基本上都是通过反射机制来实施的,具体流程如下:

 

1、方法的调用先检查AccessibleObject的override属性是否是true,如果是则表明该方法是复写的方法,可以忽略访问权限的限制,直接访问。如果不是则进行访问权限检测,用sun.reflect.Reflection的quickCheckMemberAccess方法先检验是不是public,如果不是则再用sun.reflect.Reflection.getCallerClass()方法获得调用这个方法的Class,然后再做是否有权限访问的校验,检验之后会将结果缓存

 

2、sun.reflect.ReflectionFactory调用方法newMethodAccessor创建方法访问器时,私有静态变量noInflation如果为true则直接返回MethodAccessorGenerator创建的一个MethodAccessor,否则返回DelegatingMethodAccessorImpl类,并将DelegatingMethodAccessorImpl与一个NativeMethodAccessorImpl互相引用。但DelegatingMethodAccessorImpl执行invoke方法的时候又委托给NativeMethodAccessorImpl。

 

3、NativeMethodAccessorImpl的invkoe方法,NativeMethodAccessorImpl类中有一个计数器numInvocations,每调用一次方法自增加1一次,当比 ReflectionFactory的静态常量inflationThreshold(15)大的时候,用MethodAccessorGenerator创建一个MethodAccessor,并把之前的DelegatingMethodAccessorImpl引用替换为现在新创建的MethodAccessorImpl(MethodAccessorGenerator创建的MethodAccessor强制类型转换为MethodAccessorImpl),其中MethodAccessorGenerator使用了asm(assembly)字节码动态加载技术,汇编命令有更高的执行效率。

4、Method类中的invoke方法拿到的MethodAccessor对象是被volatile变量。

总结:一个方法可以生成多个Method对象,但只有一个root对象,主要用于持有一个MethodAccessor对象,这个对象也可以认为一个方法只有一个,相当于是static的。因为Method的invoke是交给MethodAccessor执行的

我们在对加了@Test注解的方法进行debug时,JUnitCore类定义了一系列方法来启动JUnit完成对测试类的反射执行,InvokeMethod类的evaluate方法会使用测试方法(FrameworkMethod类)的invokeExplosively调用该方法的返回结果。

 

备注:

1、

访问权限 当前类 同一包 子类 其他包
public
protect ×
friendly(默认) × ×
private × × ×

        

2、源码中很多方法用native修饰符,这种修饰符表明方法是该方法的实现由非java语言实现(A native method is a Java method whose implementation is provided by non-java code.)。当被native修饰时,描述符块会有一个指向该实现方法的指针。

 

3、参考:https://www.cnblogs.com/onlywujun/p/3519037.html,文中的Reflection.getCallerClass(1)方法在JDK8 版本已过时(加上@Deprecated注解),使用静态本地方法getCallerClass()加上@CallerSensitive解决通过双重反射提升权限的漏洞

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Method的invoke方法初步了解 的相关文章

  • Scrach基本概念与操作

    基本概念 一个程序最初的触发是由事件 黄色积木 负责的 例如点击播放事件 按下空格事件 当接收到消息等 程序由舞台和角色组成 舞台和角色都可以有多个 Scratch本身提供了许多舞台和角色的素材 可直接使用 每个角色都有自己的脚本代码 由各
  • Linux下c++遍历文件夹中文件及读取绝对路径

    文件读取等操作是程序编写的基础 因此在总结了网上多个博客的基础上 写出了如下读取文件及保存绝对路径的代码片段 整理出来供大家学习 注意 这里dirent h是只有在Linux下才有的 include
  • Collection集合类和Map接口各实现类详解

    Java的集合类 collection接口和Map 一 集合概述 集合 集合是java中提供的一种容器 可以用来存储多个数据 集合和数组既然都是容器 它们有啥区别呢 数组的长度是固定的 集合的长度是可变的 数组中存储的是同一类型的元素 可以
  • 前端基础自查

    目录 h5和css3的认知 data v 03da18b4 http部分 前端HTTP优化 网页有哪些部分 服务器渲染 跨域 栅格式布局 阻止冒泡的方法 jq的认知 移动端的适配 不同尺寸屏幕 适配不同浏览器 大屏适配 设计稿 数组重复去重
  • Python入门学习01

    基础 输出 输出语句print print 输出语句 输出函数 1 在控制台输出一段文本信息 用一对英文双引号标记 print 文本信息 默认换行 2 print 文本信息 end 结尾 n 换行符 t 制表符 3 print 文本信息1
  • linux删除软件

    linux删除软件 删除软件但不删除配置文件 sudo apt get remove softname 同时删除软件包和配置文件 sudo apt get remove purge softname 删除无用依赖包 sudo apt get
  • awk从放弃到入门(1):awk基础 (通俗易懂,快进来看)

    我们先来用专业的术语描述一下awk是什么 如果你看不懂 没关系 我们会再用 大白话 解释一遍 awk是一个报告生成器 它拥有强大的文本格式化的能力 这就是专业的说法 你可能不理解所谓的报告生成器中的 报告 是什么 你可以把 报告 理解为 报
  • 负载均衡入门

    提纲 ADC 行业现状 ADC 原理 ADC 的实现方式 为什么是 ADC 而不是负载均衡 功能的扩展 解决了什么问题 可用性 Availability 伸缩性 Scalability 性能 End user performance 数据中
  • 将矩阵&概率画成图

    任何一个矩阵都能画成一个图 更严谨的来说 每个矩阵对应一个加权二分图 所谓图是指点和线的集合 二分是指两种不同的类型 加权是指每条线上都有一个数字标记 上图的三个绿点代表三行 两个红点代表两列 若对应矩阵值非零 则在绿点和红点间画一条线连接
  • SQL Server基础Sql语句复习

    基础至极 1 创建表 create table Course Cno char 4 primary key not null 创建主键 非空 Cname char 40 not null Cpno char 4 Ccredit smalli
  • JQ开发中遇到的问题(一)

    目录 目录 1 收藏与取消收藏切换 2 使用layui插件下拉选择渲染问题 1 收藏与取消收藏切换 说明 从接口中获取收藏状态 单击切换状态 如下图所示 开始状态 点击后状态 代码实现 1 全局定义一个变量 记录状态 var collect
  • 【软件测试】自动化测试战零基础教程——Python自动化从入门到实战(一)

    第一章 自动化测试基础 第一节 软件测试分类 关于软件测试领域名词颇多 发现有许多测试新手混淆概念 从不同的角度可以将软件测试有不同的分类的方法 所以 这里汇总常见软件测试的相关名词 对软件测试领域有个概括的了解 根据项目流程阶段划分软件测
  • vsftpd主动模式和被动模式

    vsftpd主动模式和被动模式 主动模式 PORT 所谓主动模式 指的是FTP服务器主动去连接客户端的数据端口来传输数据 其过程具体来说就是 客户端从一个任意的非特权端口N N gt 1024 连接到FTP服务器的命令端口 即tcp 21端
  • 【软件测试】自动化测试战零基础教程——Python自动化从入门到实战(六)

    整理不易 希望对各位学习软件测试能带来帮助 软件测试知识持续更新 第五章 自动化测试用例设计 第一节 手工测试用例与自动化测试用例 手工测试用例与自动化测试用例对比 用例选型注意事项 第二节 测试类型 测试静态内容 测试链接 功能测试 测试
  • 【软件测试】自动化测试战零基础教程——Python自动化从入门到实战(五)

    整理不易 希望对各位学习软件测试能带来帮助 第四章 自动化测试模型 一个自动化测试框架就是一个集成体系 在这一体系中包含测试功能的函数库 测试数据源 测试对象识别标准 以及种可重用的模块 自动化测试框架在发展的过程中经历了几个阶段 模块驱动
  • 数组里面对象去重的3种方法

    数组里面对象去重的方法挺多的 下面列了几种方法任君选择 下面是将要过滤的数据 将arr里面id重复的数据去掉 下面方法中用的arr都是这组数据哦 var arr id 1 name 周瑜1 id 3 name 王昭君1 id 2 name
  • Android-CMakeLists.txt 链接第三方库(动态或者静态库)到自己的生成库中

    最近在做关于NDK开发的项目 编译方式通过cmake 如何将第三方动态链接库连接到自己生成的动态库中 按照以下步骤 1 首先看目录结构 首先将第三方库复制到jniLibs下 并创建对应的CUP平台目录 2 CMakeLists txt 方式
  • 深入理解计算机系统 --- 链接

    本章目的 提供了关于链接各方面的全面讨论 从传统静态链接到加载时的共享库的动态链接 以及到运行时的共享库的动态链接 链接 linking 是将各种代码和数据片段收集并组合成一个单一文件的过程 这个文件可被加载 复制 到内存被并执行 链接可以
  • 外观设计模式

    外观设计模式 根据实际案例分析外观模式 Facade 示例 业务与设计模式落地案例 根据实际案例分析外观模式 Facade 案例 假设一个放电影功能 在播放电影时 需要放下窗帘 打开空调 打开播放机 打开音响 考虑用户观影时间较长时 提供暂
  • 集合框架之Connection(马士兵教育视频教程总结笔记)

    when to use 当不知道程序运行时会需要多少对象 或者需要以更复杂的形式来储存对象时 可以使用java集合框架 e g 假定学员数 接口 4个 Collection List Set Map 1 Collection单值 List

随机推荐

  • EasyAR4.0稀疏空间地图室内导航

    现有的AR室内导航 一种方案是利用运动跟踪实现 但是偏移较大 比较靠谱或者说能满足商业使用的还是稀疏空间地图 ARCore管叫云锚点 实现效果如下 EasyAR稀疏云地图室内导航 制作思路其实很简单 先建立空间地图 然后利用平面图像追踪在空
  • PPTP 理解以及报文的分析

    首先 先来理解下什么是 PPTP PPTP将PPP Point to Point Protocol 帧封装进IP数据报中 通过IP网络如Internet或其他企业专用Intranet等发送 PPTP通过PPTP控制连接来创建 维护 终止一条
  • Dialog显示报错:Unable to add window -- token null is not valid; is your activity running?

    很平常的显示一个dialog 出现了如上报错 网上很多都说解决方案 但是没有说原理过程 简单的说下 在显示dialog时出现 是应用没有token所导致 而应用的token一般只有Activity拥有 所以需要用Activity作为cont
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • C语言,使用函数封装,实现单词的逆置 “hello my student” 最终结果是”student my hello”

    实现单词的逆置 hello my student 最终结果是 student my hello 在该函数 void StrFun char str 循环字符串的 在该函数 void StrRev char str 主要是实现逆置的 incl
  • 超详细的Linux基础命令

    文章目录 前言 Linux目录结构 Linux命令通用格式 ls 命令 什么是工作目录 什么是 HOME 目录 目录切换相关命令 cd 命令 pwd 命令 特殊的路径符 创建目录 文件操作相关命令 touch 命令 cat 命令 more
  • java 日历_java的日历类(Calendar)详解

    老实说对于时间的处理我大部分都在用Calendar日历类解决 现在整理一下 方便以后开发查阅 java util 类 Calendar java lang Object 继承者 java util Calendar 所有已实现的接口 Ser
  • 火线 地线 零线 漫谈

    交流电不分正负 那为什么又要分火线和零线呢 零线的对地电位不一定为零 接近0 零线的最近接地点是在变电所或者供电的变压器处 交流电正半周火线电压为220v 零线接近0v 正 负半周时火线电压为负220v 零线电压接近0V 负 所以二相插座不
  • 此URL不支持Http方法GET 详情 请求行中接收的方法由源服务器知道,但目标资源不支持 解决方法之一

    因为response和request位置反了 这里位置反了所以doGet是灰的 换了个位置就好了 具体原因https www it1352 com 982509 html
  • 深入理解 Spring Boot Starters 原理(手写Spring boot Start)

    版权声明 本文为博主原创文章 遵循 CC 4 0 by sa 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net zhaohong bo article details 89924053 一 Spri
  • 英特尔的集显和Nvidia的独显切换(切换之后永久有效)

    参考网址 https blog csdn net a850565178 article details 107979314 前提介绍 安装了nvidia驱动之后 有些电脑会发现setting的devices的Graphics显示的还是llv
  • SmartAndroid之SmartJump,告别onActivityResult

    SmartJump 需求 应用场景 实现思路 代码 调用示例 后记 需求 在跳转到另一个Activity后 通过回调直接获取到数据 应用场景 普通的activity跳转 回调获取数据可以使逻辑更清晰 第三方库中activity数据回调可以让
  • 实战案列:AntiDebug

    往期推荐 self debugging反调试 轮循检测技术 进程名称检测 Java层反调试 Anti Debug主要是通过各种函数去确定当前进程是否处于被调试的状态 一 IDA里面静态分析so文件 1 将文件拖入jdax gui中 进行静态
  • PLSQL字体设置常见问题

    PLSQL字体设置常见问题 从网络资源下载的PLSQL 字体默认的大小不太适合大屏幕的电脑 因为看起来字体很小 我们可打开PLSQL来设置字体的大小以及其他常规设置 一 字体太小 操作流程 菜单栏的Tools gt Preferences
  • 静态多态和动态多态

    多态 静态多态和动态多态 多态的实现主要分为静态多态和动态多态 静态多态主要是重载和模板 在编译的时候就已经确定 动态多态是用虚函数机制实现的 在运行期间动态绑定 举个例子 一个父类类型的指针指向一个子类对象时候 使用父类的指针去调用子类中
  • vue学习 十二 vue文件目录知晓 or 组件嵌套

    说明 我使用的是HBuilder 软件能用就可以了 查看顺序是 index html 入口文件 gt main js gt App vue 模板文件 可以看出能显示出欢迎页面 还有那个大V都在这里可以看到 gt components 自定义
  • Redis DEL删除命令是否会导致阻塞

    DEL命令是存在阻塞的可能性的 1 使用DEL命令删除key DEL keya keyb keyc 2 根据删除的key的数量和类型 操作的时间复杂度不同 删除N个key key中的数量为M则时间复杂度是O N M 删除一个字符串的key则
  • 类中有引用需要注意——非静态的引用成员错误提示,不能使用默认的赋值运算符

    我们知道 当我们我们没有定义赋值操作符时 编译器会生成一个默认的赋值操作符执行浅拷贝 就像默认构造函数一样是编译器默认生成的 而如果勒种有引用就需要注意一个大大的误区 我们知道引用在定义的时候就需要初始化 指定这个引用变量是哪个变量的别名
  • C常用标准库及函数

    常用头文件 stdio h stdlib h ctype h string h math h system h 1 stdio库 主要功能是输入输出操作 包括文件输入输出 标准输入输出 输出函数 int puts const char st
  • Method的invoke方法初步了解

    Java调试过程中 我们有时候会需要对JVM运行过程中哪出了问题进行调试 先从最基础的了解 我们都知道Java框架中方法的调用基本上都是通过反射机制来实施的 具体流程如下 1 方法的调用先检查AccessibleObject的overrid