摘要:
我们知道,很多maven官方插件都支持skip参数,命令行指定skip=true即可跳过此插件的执行,非常方便。但是很多第三方的插件根本就不支持skip参数,无法通过命令行传参的方式跳过插件的执行。 我们可以用一些非官方的方式绕过这个限制。总体思路为,将你想要跳过的插件的phase参数指定为一个不存 阅读全文
摘要:
很多文章搞长篇大论大讲特讲人类为了让计算机能够准确表示各种字符的演化历史,这完全是没有必要的,几句话就能说明白。 "字符集"和"字符集编码"是两回事 字符集(Charset Set),仅仅是一套从【字符】到【数字】的映射字典,它只规定了应该用什么数字来标识字符,仅此而已,至于计算机在存储的时候应该用 阅读全文
摘要:
用JavaFX写GUI的朋友肯定少不了SceneBuilder这个神器,拖拖拽拽就能完成窗口布局。但是对于Mac M1的用户来说, SceneBuilder 并没有提供M1版本,官方的intel版本能用但是很卡,用起来很难受。下面我们来看看如何直接从源码构造M1版本的SceneBuilder。 准备 阅读全文
摘要:
本篇我们专注invokevirtual这一条指令,先通过简单粗暴的方式实现指令的功能,然后探究如何通过著名的虚方法表(Virtual Method Table)来进行一些优化。 指令含义 invokevirtual用于调用除静态方法、构造方法、私有方法、接口方法外的所有方法。其指令的格式为: inv 阅读全文
摘要:
我们都知道在Java中final字段都是要在定义时完成初始化工作的,否则通不过编译。但是有一处例外,那就是对于对象的字段来说final字段可以"延迟"到构造方法,或者static {}语句块中初始化,例如下面的代码 public class FinalTest { private static fi 阅读全文
摘要:
首先需要明确几个问题。 没有Native方法JVM什么也做不了 可能很多人认为native方法是Java里的禁区,使用本地方法会牺牲可移植性,而且还会有额外开销,貌似几乎没有程序员会在实际项目中写本地方法,这玩意就是个很冷门的东西。其实这种看法是错误的,哪怕一个Hello Word程序都是要严重依赖 阅读全文
摘要:
一直以来又长又臭的调用链简直就是Java语言的标志性特色,方法调用可谓是Java世界里表达一切逻辑的基石。现在我们终于具备了实现它的基础。 JVM中的5条方法调用指令 在JVM中触发方法调用的指令有5条,分别是: invokestatic 调用静态方法 invokespecial 调用构造方法 in 阅读全文
摘要:
在上一篇中我们实现了一个能跑的解释器,支持了一些基本的栈操作指令。现在我们就可以开始实现"有点用"的数学运算和条件判断了。 github: https://github.com/wanghongfei/mini-jvm 局部变量表、程序计数器 由于JVM字节码是基于栈的指令集,因此一切操作都是以栈为 阅读全文
摘要:
在上一篇中我们已经完成了class文件的解析工作,虽然没有解析所有的属性,但是已经足够支持一些基本的算法题Java代码编译生成的class文件了。有了这一步,日后如果遇到新的特性需要支持,只需缺哪补哪,补上对应属性的解析逻辑就可以了。下一步就是实现一个基本的执行引擎,即解释器,并且支持基本的栈操作相 阅读全文
摘要:
正确解析class文件是万里长征第一步。本篇我们会全程使用golang完成class文件的解析工作。 数据类型 JVM的class文件完全是二进制文件,最小单位是字节,也有数据类型,但都是字节的整数倍(废话)。规范中class文件一共有两类数据,一种是无符号整数,一种是表。无符号整数一共有u1,u2 阅读全文