jvm(7)
方法调用的底层实现
1. 一般我们写的代码都是经过编译,类加载,进入运行时数据区,一般是方法区,人关注的是方法的执行
2. jvm关注的是字节码的执行,
3. main函数是指令的起点,jvm创建main线程执行main方法,出发jvm的一些列指令,使jvm跑起来
4. 所以要了解在jvm中 方法调用方法的过程
方法调用的字节码指令
1. invokestatic 调用静态方法
2. invokespecial 调用私有实例方法
3. invokevirtual 调用非私有实例方法(final 除外)
4. invokeinterface 调用非私有接口
5. invokedynamic 调用动态方法
非虚方法
1. 如果方法在编译器就确定了具体的调用版本,运行时不可变
2. invokestatic;invokespecial
虚方法
1. 与非虚方法相反的,在方法在运行过程中是可变的
2. jvm根据调用者的类型确定调用的目标方
3. invokevirual;invokeinterface
静态分派
1. 多用于方法的重载(方法名相同,方法的类型或者个数不同)
2.
3.
动态分派
1. 多用于放的重写
2.
3. jvm中虚拟机栈中的动态链接就是invokevirtual将引用变成直接引用
方法表
1. 动态分派会导致jvm频繁搜索元数据,所以建了个方法表
2.
lambda表达式
1. invokedynamic 动态调用,类似反射,但是比反射快,权限没有反射大
2. 创建methodtype,methodhandle 句柄,传入方法参数到handle调用方法
lambda的捕获与非捕获
1. 非捕获 不传入变量
2. 捕获 传入变量
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理