作者:ksfzhaohui 链接:https://juejin.cn/post/6976894759134560292 来源:稀土掘金


字节码我们都知道是java文件经过编译之后的class文件,每一个字节码文件都要由10部分按照固定的顺序组成;增强其实就是对字节码文件进行改造生成一个新的文件,已达到我们的目的,比如动态代理,AOP等;当然增强完需要能被使用,所以涉及到到加载的问题;在介绍之前我们先来看看都有哪些字节码增强技术。
常见的字节码增强技术大致分为两类:静态增强和动态增强;静态增强最常见的就是AspectJ了,可以直接编译类,有自己的语法;动态增强包括:ASM、Javassist、Cglib、Java Proxy;下面分别做简单介绍。
AspectJ来自于Eclipse基金会,属于静态织入,主要采用的是编译期织入,在这个期间使用AspectJ的acj编译器(类似javac)把aspect类编译成class字节码;下面看一下AspectJ是如何使用的;
AspectJ官网地址:www.eclipse.org/aspectj/ 直接下载最新版:AspectJ 1.9.6;直接运行以下命令即可安装:
指定安装目录,然后配置classPath和path即可:java -jar aspectj-1.9.6.jar
ASPECTJ_HOME=E:\\\\aspectj1.9
CLASSPATH=...%ASPECTJ_HOME%\\\\lib\\\\aspectjrt.jar
PATH=...%ASPECTJ_HOME%\\\\bin
AspectJ提供的Demo进行测试examples\\\\tjp目录下: 里面有两个java文件分别是Demo.java和GetInfo.java,Demo就是我们正常的java文件,而GetInfo是增强文件,里面有一些AspectJ语法,需要使用ajc命令编译
可以发现经过ajc编译后的新class文件,go和bar两个方法都得到了增强,在方法调用前和后、以及方法参数都添加了日志输出;可以发现AspectJ在运行前就已经对class文件做了增强处理;Spring AOP借鉴了AspectJ的一些概念,但是在实现上并没有采用AspectJ而使用动态增强技术;E:\\\\aspectj1.9\\\\doc\\\\examples\\\\tjp>ajc -argfile files.lst
E:\\\\aspectj1.9\\\\doc\\\\examples\\\\tjp>cd ..
E:\\\\aspectj1.9\\\\doc\\\\examples>java tjp.Demo
Intercepted message: foo
in class: tjp.Demo
Arguments:
0. i : int = 1
1. o : java.lang.Object = tjp.Demo@6e3c1e69
Running original method:
Demo.foo(1, tjp.Demo@6e3c1e69)
result: null
Intercepted message: bar
in class: tjp.Demo
Arguments:
0. j : java.lang.Integer = 3
Running original method:
Demo.bar(3)
result: Demo.bar(3)
Demo.bar(3)
ASM是一个通用的Java字节码操作和分析框架,它可以用来修改现有的类或直接以二进制形式动态生成类;ASM提供了一些常见的字节码转换和分析算法,从中可以构建定制的复杂转换和代码分析工具;几个核心的类: