【摘要】
小傅哥 | https://bugstack.cn 沉淀、分享、成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获。目前已完成的专题有;Netty4.x实战专题案例、用Java实现JVM、基于JavaAgent的全链路监控、手写RPC框架、架构设计专题案例、源码分析、算法学习等。
一、前言
写这篇文章的时候我在想可能大部分…
小傅哥 | https://bugstack.cn
沉淀、分享、成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获。目前已完成的专题有;Netty4.x实战专题案例、用Java实现JVM、基于JavaAgent的全链路监控、手写RPC框架、架构设计专题案例、源码分析、算法学习等。
一、前言
写这篇文章的时候我在想可能大部分程序员包括你我,常常都在忙于业务开发或奔波在日常维护与修复BUG的路上,当不能从中吸取技术营养与改变现状后,就像一台恒定运行的机器,逃不出限定宇宙速度的一个圈里。可能你也会有自己的难处,平时加班太晚没有时间学习、周末家里琐事太多没有精力投入,放假计划太满没有空闲安排。总之,学习就会被搁置。而当一年年的过去后,当自己的年龄与能力不成匹配后又会后悔没有给多投入一些时间学习成长。
尤其是一线编码的技术人,除了我们所能看到的在技术框架里(SSM)开发的业务代码,你是否有遇到过学习瓶颈,而这种瓶颈又是你自己不知道自己不会什么,就像下面这些技术列表里,你有了解多少;
1. javaagent
2. asm
3. jvmti
4. javaassit
5. netty
6. 算法,搜索引擎
7. cglib
8. 混沌工程
9. 中间件开发
10. 高级测试;压力测试、链路测试、流量回放、流量染色
11. 故障系列;突袭、重现、演练
12. 分布式的数据一致性
13. 文件操作;es、hive
14. 注册中心;zookeeper、Eureka
15. 互联网工程开发技术栈;spring、mybaits、网关、rpc(thrift, grpc, dubbo)、mq、缓存redis、分库分表、定时任务、分布式事物、限流、熔断、降级
16. 数据库binlog解析
17. 架构设计;DDD领域驱动设计、微服务、服务治理
18. 容器;k8s, docker
19. 分布式存储;ceph
20. 服务istio
21. 压测 jmter
22. Jenkins-部署java代码项目 + ansible
23. 全链路监控,分布式追踪
24. 语音识别、语音合成
26. lvs nginx haproxy iptables
27. hadoop mapreduce hive sqoop hbase flink kylin druid
那么!在本公众号(bugstack虫洞栈)中,会专门介绍一些高级技术的应用,可能在平时开发中看不到,但是却一直出现在你的框架中,以某个支撑服务而存在。好,现在开始就搞一下其中的一个技术点 ASM
,看看它的真面目。那么学习之前先看下他有什么用途;
- 类的代理,如cglib
- 混沌工程
- 反向工程
- 结合
javaagent
做到非入侵式监控,方法耗时、日志、机器性能等等 - 破解
ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。
为了更方便的学习ASM
,我将《ASM4使用手册》以及一些技术点整理成在线文档,可以随时方便查阅(http://asm.itstack.org);
另外关于本文中出现的代码例子,可以通过在公众号(bugstack虫洞栈)内回复,源码下载获取。
二、环境配置
- jdk 1.8
- idea 2019.3.1
- asm-commons 6.2.1
三、工程信息
- itstack-demo-asm-01:字节码编程,HelloWorld
- itstack-demo-asm-02:字节码编程,两数之和
- itstack-demo-asm-03:字节码增强,输出入参
- itstack-demo-asm-04:字节码增强,调用外部方法
以上源码可以通过关注公众号:bugstack虫洞栈
,回复 下载源码
获取
四、HelloWorld还可以这样写
你所熟悉的HelloWorld是不这样;
public class HelloWorld { public static void main(String[] var0) { System.out.println("Hello World"); }
}
那你有尝试反解析下他的类查看下汇编指令吗,javap -c HelloWorld
public class org.itstack.demo.test.HelloWorld {
public org.itstack.demo.test.HelloWorld(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3 // String Hello World 5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 8: return
}
指令 | 描述 |
---|---|
getstatic | 获取静态字段的值 |
ldc | 常量池中的常量值入栈 |
invokevirtual | 运行时方法绑定调用方法 |
return | void函数返回 |