ASM: 一个低调成功者的自述

开发 开发工具
最近Java 帝国给我颁发了一个特殊贡献勋章, 奖励我对繁荣Java 虚拟机市场做出的重大贡献, 不谦虚的说, 这绝对是名副其实, 原来JVM中只有一门语言,那就是Java , 你看看现在语言多的都选不多来了。

我就是那个不太知名的ASM, 你可能听说过我,也可能完全不知道我。

但是你要是认为我无足轻重,那就大错特错了。

没有我, 你经常使用的Spring , hibernate 将会失去最核心的功能。

没有我, Jython , JRuby 根本就移植不到Java 虚拟机中来。

没有我, Clojure, Groovy这些时髦的语言也没法在Java 虚拟机中运行。

一句话来概括我的能力: 我可以动态的修改已经编译过的class , 还可以动态的生成新的java class, 注意我说的动态这个词, 那可以是完全在运行时, 在内存中完成的, 这是一件非常厉害的本事。

既然我是为了动态的修改class 文件而生, 为什么叫做ASM呢?

其实我的创造者在创造我的时候, 为了起名也是大费周章,后来他突然想到C语言中的__asm__ 这个关键字, 可以允许你们在C语言中写点汇编, 他就把ASM这个关键字挪用了。

考虑到起名字确实是一件非常折磨人的事情, 我也就忍了, 就叫这个ASM吧, 至少能体现出我位于系统的***层, 不, 应该说是最基础的层次。

我听到下面有人问了, 不就是动态生成类吗? 我完全可以像jsp那样, 使用JavaComplier接口在运行时动态的编译一个java 源代码, 这不也是动态生成class吗?

其实不一样, 你那是生成新的类, 能对现有的class 进行修改吗?

又有人发话了, 你为什么要动态的在运行时来修改类啊? 我为什么不能在编译以前就把类的功能都写好啊?

当然,你要是能把所有的功能都写好,那自然不错,但是人生之不如意,十之八九啊。

举一个最最极端的例子,你从别人那里获得了一个没有源代码的jar 文件, 你想对其中的一个class 进行增强,肿么办? 你可能说: 我可以反编译啊.. 算了吧, 反编译的代码能看吗?

还有你们经常挂在嘴边的AOP, 在配置文件中声明一些功能例如事务支持, 然后要这些功能动态的织入到业务代码中,肿么办? 有人说我可以用Java 动态代理啊, 是, 你可以用,但是人家要是没有接口不还是得瞪眼干着急?

顺便吐个槽,你们AOP的那些术语实在是太烂, 什么PointCut, 什么Advice, 除了把人搞晕,还有什么用处?

对了, 还有那个Hibernate , 难道你不知道那个所谓的实体类是被我给增强过的? 你使用的并不是你看到的, 懂了么?

那到底是怎么实现的动态修改类的? 其实很简单, 去下载一个Java 虚拟机规范, 花上半年时间, 把每个字都搞懂了, ***像黑客帝国中的Neo那样, 看到的整个世界都是二进制流, 你自然明白我是怎么做的了。

[[184050]]

我给你简单的说一下: 我的核心呢主要是三个类, ClassReader, ClassWriter , ClassVisitor, 你用这三个家伙就可以去解析一个class 字节码, 获得字段了,方法了等信息, 当然最重要的可以对这些信息进行修改, 最终形成一个代表新class 的字节码数组, 剩下的事估计你就知道怎么做了, 其实也不属于我ASM了。

还不知道? 很简单嘛, 就是用个ClassLoader 把这个字节码数组Load到虚拟机中, 然后通过反射一调用,不就完了?

对了, 我的创造者使用了Visitor模式来设计这个API, 说实在的,设计的还真不错。 细节太多 ,我在这里就不罗嗦了, 感兴趣的同学可以看看 (http://download.forge.objectweb.org/asm/asm4-guide.pdf ) , 绝对物超所值, 当然你的英文要好。

说了这么多,还是上一点代码吧, 让你对我有个直观的认识:

我估计你也看不明白, 其实就是hello world了:

你可能心里在想, word哥, 想使用你ASM需要非常透彻的理解Java 虚拟机指令和Java虚拟机内部结构才能使用啊。

没错, 我刚刚说过, 需要读懂Java 虚拟机规范 , 我负责处理的是最基础的东西 , 很多码农并不会直接使用我来编程。

有个叫CGLib的家伙在我的基础之上做了不错的封装, 他做了一些高级的API抽象, 让普通的程序员也能够比较简单的对一个现成的类的行为进行修改。 由于更容易使用, CGLib的用户反而更多, 像Spring , Hibernate 。。。 我的风头完全被盖过了, 我想这就是我为什么这么低调、默默无闻的原因。

但是我初心不改 ,坚持对***层的字节码进行操作, 我持续优化, 让自己变的又小又快, 为别的软件提供最有力的支持。

一开始我就说了Clojure对吧, 这是一个函数式编程的语言, 是解释执行的,没有编译过程, 那他凭什么能运行在Java 虚拟机上? 不就是利用我ASM来动态的生成字节码 吗? Jython, JRuby, Groovy 也是大同小异。

最近Java 帝国给我颁发了一个特殊贡献勋章, 奖励我对繁荣Java 虚拟机市场做出的重大贡献, 不谦虚的说, 这绝对是名副其实, 原来JVM中只有一门语言,那就是Java , 你看看现在语言多的都选不多来了。

好, 今天就说到这里吧, 下次再会。

【本文为51CTO专栏作者“刘欣”的原创稿件,转载请通过作者微信公众号coderising获取授权】

戳这里,看该作者更多好文

责任编辑:武晓燕 来源: 51CTO专栏
相关推荐

2017-09-11 18:24:39

企业应用自述

2010-05-04 17:22:18

IT培训

2012-10-29 09:43:04

成功者商业案例创业

2009-09-24 09:12:22

开源商业模式Intel

2009-12-16 12:30:25

openSUSE操作系

2023-08-25 16:33:10

2013-10-09 10:04:20

LinuxGit

2013-12-23 09:32:27

亚马逊平板电脑鲍尔默

2022-07-07 09:28:29

RocketMQ存储系统

2015-10-10 11:09:48

NFVNFVI网络虚拟化

2021-05-24 10:38:54

数据数据策略业务

2015-11-05 15:55:51

2009-02-10 09:06:21

DBA数据库DB2

2020-12-10 10:29:32

大数据科学数据科学

2009-04-01 09:40:16

低学历程序职场

2023-04-24 12:57:01

数据中心综合布线

2012-12-04 09:41:00

2017-07-13 17:33:18

生成对抗网络GANIan Goodfel

2017-11-07 11:36:57

开源项目代码

2021-09-02 16:10:21

人工智能机器学习技术
点赞
收藏

51CTO技术栈公众号