字节码技术应用
字节码技术的应用场景包括但不限于AOP,动态生成代码,接下来讲一下字节码技术相关的第三方类库,第三方框架的讲解是为了帮助大家了解字节码技术的应用方向,文档并没有对框架机制进行详细分析,有兴趣的可以去了解相关框架实现原理和架构,也可以后续为大家奉上相关详细讲解。
ASM
ASM 是一个 Java 字节码操控框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。
说白了,ASM可以在不修改Java源码文件的情况下,直接对Class文件进行修改,改变或增强原有类功能。
在熟悉了字节码原理的情况下,理解动态修改字节码技术会更加容易
接下来我们只针对ASM框架中几个主要类进行分析,并举个栗子帮助大家理解。
主要类介绍
ClassVisitor
提供各种对字节码操作的方法,包括对属性、方法、注解等内容的修改:
ClassWriter
主要功能就是记录所有字节码相关字段,并提供转换为字节数组的方法:
ClassReader Opcodes
ASM除了可以动态生成新的Class文件,还可以修改原有Class文件的功能或者在原Class文件新增方法字段等,这里不再举例子,有兴趣的可以自己研究一下。不过大家已经发现,使用ASM动态修改Class文件,难度还是有的,需要使用者对JVM指令、Class格式相当熟悉,
除了ASM,还有其他第三方工具也提供了对字节码的动态修改,包括CGLib,Javassisit,AspectJ等,而这些框架相比于ASM,则是将JVM指令级别的编码封装起来,让使用者直接使用Java代码编辑,使用更加方便。
引申
既然JVM运行时识别的只是.class文件,而文件格式我们也了解,那是不是只要我们能够正确生成.class文件就可以直接运行,甚至可以不用Java语言?
答案大家肯定都知道了,当然可以。Kotlin,Scala,Groovy,Jython,JRuby…这些都是基于JVM的编程语言。
那如果我们想自己实现一款基于JVM的开发语言,怎么搞?
定义语义,静态,动态?,强类型,弱类型?…
定义语法,关键字(if,else,break,return…)
定义代码编译器,如何将自己的代码编译成.class
知识来源:
【基础】什么是字节码,作用是什么_哔哩哔哩_bilibili
字节码详解_封何的博客-CSDN博客