JVM实战-掌握分派方法规则

方法调用问题

java 复制代码
class GrandFather {
void thinking() {
	System.out.println("i am grandfather");
	}
}
class Father extends GrandFather {
	void thinking() {
		System.out.println("i am father");
	}
}
class Son extends Father {
	void thinking() {
	// 请读者在这里填入适当的代码(不能修改其他地方的代码)
	// 实现调用祖父类的thinking()方法,打印"i am grandfather"
	}
}

Java程序中,可以通过"super"关键字很方便地调用到父类中的方法,但如何访问祖类的方法

使用MethodHandles

java 复制代码
void thinking() {
try {
	MethodType mt = MethodType.methodType(void.class);
	Field lookupImpl = MethodHandles.Lookup.class.getDeclaredField("IMPL_LOOKUP");
	lookupImpl.setAccessible(true);
	MethodHandle mh = ((MethodHandles.Lookup) lookupImpl.get(null)).findSpecial(GrandFather.class,"thinking", mt, 			GrandFather.class);
	mh.invoke(this);
} catch (Throwable e) {
}
}

基于栈的字节码解释执行引擎

执行引擎

基于栈的指令集与基于寄存器的指令集

Javac编译器输出的字节码指令流,基本上[1]是一种基于栈的指令集架构(Instruction SetArchitecture,ISA),字节码指令流里面的指令大部分都是零地址指令,它们依赖操作数栈 进行工作。

基于栈的指令集主要优点是可移植 ,因为寄存器由硬件直接提供,程序直接依赖这些硬件寄存器则不可避免地要受到硬件的约束。栈架构指令集的主要缺点是理论上执行速度相对来说会稍慢一些

基于栈的解释器执行过程

示例字节码

java 复制代码
public int calc();
	Code:
		Stack=2, Locals=4, Args_size=1
		0: bipush 100
		2: istore_1
		3: sipush 200
		6: istore_2
		7: sipush 300
		10: istore_3
		11: iload_1
		12: iload_2
		13: iadd
		14: iload_3
		15: imul
		16: ireturn
}

操作数入栈 遇到符号出栈计算

相关推荐
Bug退退退1236 小时前
JVM 内存结构
jvm
那我掉的头发算什么12 小时前
【javaEE】多线程--认识线程、多线程
java·jvm·redis·性能优化·java-ee·intellij-idea
堕落年代1 天前
JVM新生代转老年代机制详解
jvm
235161 天前
【JVM】Java为啥能跨平台?JDK/JRE/JVM的关系?
java·开发语言·jvm·spring boot·后端·spring·职场和发展
AAA卷不动了1 天前
JVM(二)------ 类加载、初始化与单例模式的联系
java·jvm·单例模式
程序员卷卷狗1 天前
JVM 内存结构与 GC 调优全景图
java·开发语言·jvm
闲人编程1 天前
构建一个短链接生成器服务(FastAPI + SQLite)
jvm·python·sqlite·fastapi·生成器·短链接·caodecapsule
Boop_wu2 天前
[Java EE] 多线程 -- 初阶(1)
java·jvm·算法
小满、2 天前
对象住哪里?——深入剖析 JVM 内存结构与对象分配机制
java·jvm·#java对象分配·#hotspot实现
笑我归无处2 天前
强引用、软引用、弱引用、虚引用详解
java·开发语言·jvm