Dubbo 源码剖析与实战
何辉
平安壹钱包架构师
4711 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 33 讲
开篇词 (1讲)
Dubbo 源码剖析与实战
15
15
1.0x
00:00/00:00
登录|注册

16|Compiler编译:神乎其神的编译你是否有过胆怯?

你好,我是何辉。首先祝你新年快乐。
今天是我们深入研究 Dubbo 源码的第五篇,Compiler 编译。
在“点点直连”中,我们实现了一套万能管控平台来修复数据,其中就有通过市场上的 Groovy 插件编译 Java 源代码来生成类信息。
而上一讲“Wrapper 机制”中,在实现自定义代理的时候,我们也使用了 JavaCompiler 来编译源代码,只不过编译的时候,借助了磁盘上的 class 文件才得以生成类信息。
掌握了这两种动态编译方式,相信你在动态编译这块已经有了一定的基础,如果你还是觉得有点胆怯,今天我们上点难度,再学习 2 种 Compiler 方式,帮助你在底层框架开发层面拥有更强大的技术支撑。

Javassist 编译

还是以上一讲的自定义代理为例。这张图你应该还有印象,我们尝试通过添加一层代理的方式,把各种 if…else 的硬编码逻辑转变为动态生成:
在实现自定义代理的过程中,我们采用的是最纯粹的字符串拼接的方式,拼接出了动态的源代码,虽然实用,但是写起来也费劲。
有没有通过 set 或 get 操作就能实现创建类的简单方式,来改造图中的代理实现过程呢?
我们在脑内检索一番,平常都是直接将编写好的代码交给 Javac 编译器去编译的,现在要通过某种工具简单的进行 set 或 get 动态创建一个类,怎么办呢,突然灵光一闪,在上一讲“Wrapper 机制的原理”代码流程中,我们看到了一段 makeClass 的样例代码,难道 Dubbo 已经有了类似的先进操作么?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了动态编译技术的细节,介绍了通过Compiler编译、Groovy插件和JavaCompiler实现动态代理的方法,以及Javassist插件提供的API,使Java程序能够在运行时定义新类并修改类文件。文章还展示了使用Javassist实现动态创建代码模板的示例,以及如何利用Javassist的API简化动态代理类的创建过程。此外,还介绍了ASM和Javassist两种字节码操作工具的特点和应用场景,帮助读者更好地理解和应用这些工具。通过阅读本文,读者能够快速了解动态编译的概念和技术特点,以及如何利用Javassist插件来简化动态代理类的创建过程。整体而言,本文为读者打开了一扇通往编译世界的神奇大门,让他们能够更深入地了解动态编译的原理和应用。文章还通过分析java.lang.Class#getDeclaredMethod方法的调用流程和性能损耗,提醒读者在使用Java反射时需谨慎设计,避免大量耗时和内存的开销。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Dubbo 源码剖析与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(4)

  • 最新
  • 精选
  • 王建新
    上一节和这一节讲的完全不搭边呀,最主要的核心关联没说上,ASM语法代码写了那么多看那干啥。。。

    作者回复: 你好,王建新:别心急,认真仔细的深入看几遍,其中的原理相信你会体会到的。

    2023-07-28归属地:北京
  • 王轲
    `...用 0表示,方法中的第一个参数用1 表示...` 这里看起来显示有误,应该是`...用 $0表示,方法中的第一个参数用$1 表示...`

    作者回复: 你好,王轲:是滴,显示有误,非常感谢~ 正确的是这样的: 在对方法的入参字段名进行逻辑处理时,就得替换成 $ 占位符,方法中的 this 引用,用 $0 表示,方法中的第一个参数用 $1 表示,第二个参数用 $2 表示,以此类推。

    2023-01-25归属地:美国
  • 斯瓦辛武Roy
    老师春节好,请教个问题,再看官方文档的时候https://cn.dubbo.apache.org/zh/docsv2.7/user/references/telnet/ 用了这个命令trace XxxService: 跟踪 1 次服务任意方法的调用情况 我调用自己本地的dubbo服务,但这个命令没有反应,请教一下老师这个是什么原因

    作者回复: 你好,斯瓦辛武Roy:我这边按照你所描述的方式,验证了一下,都是正常的,我这边我说下我的操作步骤,你尝试按照我的步骤试试: 1. 启动提供方成功后,打开命令窗口,输入命令:telnet 127.0.0.1 28045 2. 输入完命令后,直接回车,然后你会看到“dubbo>”这样的内容显示。 3. 然后在“dubbo>”后面继续追加 trace 命令,比如:dubbo>trace com.hmilyylimh.cloud.facade.demo.DemoFacade 4. 在第 3 步骤的命令输入完后,紧接着再次回车 5. 运行消费方来调用 DemoFacade 接口,然后就能在命令窗口看到 trace 命令跟踪的结果了。

    2023-01-24归属地:江苏
  • 熊悟空的凶
    老师,新年好

    作者回复: 你好,熊悟空的凶:兔年吉祥,在过年的闹市中还能静心学习,让我想起了我刚工作的那几年,每年过年的晚上都在挑灯奋战努力写代码学习。你还是很棒的,闹市中能静下心来的学习你,将来一定是钱兔无量,为你加油喝彩,点赞~

    2023-01-23归属地:北京
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部