32 | 字节码生成:为什么Spring技术很强大?
宫文学
该思维导图由 AI 生成,仅供参考
Java 程序员几乎都了解 Spring。它的 IoC(依赖反转)和 AOP(面向切面编程)功能非常强大、易用。而它背后的字节码生成技术(在运行时,根据需要修改和生成 Java 字节码的技术)就是一项重要的支撑技术。
Java 字节码能够在 JVM(Java 虚拟机)上解释执行,或即时编译执行。其实,除了 Java,JVM 上的 Groovy、Kotlin、Closure、Scala 等很多语言,也都需要生成字节码。另外,playscript 也可以生成字节码,从而在 JVM 上高效地运行!
而且,字节码生成技术很有用。你可以用它将高级语言编译成字节码,还可以向原来的代码中注入新代码,来实现对性能的监测等功能。
目前,我就有一个实际项目的需求。我们的一个产品,需要一个规则引擎,解析自定义的 DSL,进行规则的计算。这个规则引擎处理的数据量比较大,所以它的性能越高越好。因此,如果把 DSL 编译成字节码就最理想了。
既然字节码生成技术有很强的实用价值,那么本节课,我就带你掌握它。
我会先带你了解 Java 的虚拟机和字节码的指令,然后借助 ASM 这个工具,生成字节码,最后,再实现从 AST 编译成字节码。通过这样一个过程,你会加深对 Java 虚拟机的了解,掌握字节码生成技术,从而更加了解 Spring 的运行机制,甚至有能力编写这样的工具!
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了Java字节码生成技术及其在Spring框架中的应用。通过讲解Java虚拟机和字节码的指令、基于栈的虚拟机和基于寄存器的虚拟机的运行机制,以及使用ASM工具生成字节码的过程,读者可以深入了解字节码生成技术的实用价值和基本原理。文章还掏出了基于AST生成JVM字节码的逻辑,以及Spring框架中与字节码生成技术相关的内容。通过掌握字节码生成技术,读者可以更深入了解Java虚拟机,掌握Spring的运行机制,甚至有能力编写类似的工具。整体而言,本文对于想要深入了解Spring技术背后支撑的读者具有很高的参考价值。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编译原理之美》,新⼈⾸单¥59
《编译原理之美》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(8)
- 最新
- 精选
- 风老师能不能为我们展望一下量子计算机的面世和普及,会给编译器、操作系统、网络等传统计算机技术带来什么样的冲击?会不会完全是另外一套技术栈?
作者回复: 答案是肯定的。因为编译器、操作系统,都是跟底层架构关系密切。我们目前用的编译器和操作系统的基本架构,跟50年前没有太大区别,原因就是计算机的基础架构没有改变。 你的问题是个好问题。我不一定能安排在正文里。但我记下来,有机会再发一篇文章,或者单独回复你!
2019-11-08314 - 孤星可我正在写一个简单的 解释型 jvm 有兴趣欢迎共建 github mini-jvm
作者回复: 喔,不错。极客范! 这种练习会极快地提升自己,值得提倡! 我先去关注一下,看到了:https://github.com/guxingke/mini-jvm
2019-11-1811 - 树袋熊老师,为什么把dsl编译成字节码会提高性能呢?和用java程序来解析dsl,然后用jvm运行两者有什么不同呢?dsl编译成字节码比较快是相对什么情况比较快?
作者回复: 这跟解释执行的语言速度慢,而编译后的语言执行速度快,是一样的道理。 以一个简单的加法为例,比如执行“a+b”,如果编译执行,可以知道a和b是什么数据类型,直接生成对应的目标代码。在Java字节码中,处理整数加法和浮点数加法的指令是不一样的。 而如果你写个解释器执行,就必须在运行时判断它们的数据类型,然后执行针对某种数据类型的运算。实际的发生的运算量,要比编译的情况下大很多。
2020-06-262 - sugar补充一点:基于寄存器的虚拟机,google的js虚拟机v8目前也是了(以前是栈机)。2020-05-034
- Geek_08d95a老师 你好 你说的你们正在使用dsl这块做规则引擎 可以分享一下吗2022-11-27归属地:广东1
- 阿鼎像c++这种编译型语言,如何做到AOP、IOC?2021-08-201
- dll栈机并不是不用寄存器,实际上,操作数栈是可以基于寄存器实现的,寄存器放不下的再溢出到内存里。只不过栈机的每条指令,只能操作栈顶部的几个操作数,所以也就没有办法访问其它寄存器,实现更多的优化 -—————————————————————————————————— 不太理解,jvm的指令只能操作栈顶的数据,栈一定不在寄存器上,cpu是通过把这部分字节码的栈放到高速缓存里被快速读取到吗?要是次次都从内存读不得慢死了吗? 但是好像栈用到对象引用地址,对象都得从堆上取真正的对象数据,那不是次次都得访问内存?jvm是自己内部的机制产生的指令才会用到寄存器?专门操作字节码的指令就不用寄存器?是这样吗2022-07-27
- ifelse学习了,字节码生成2021-10-25
收起评论