字节码增强概述

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

image.png

https://cdn.nlark.com/yuque/0/2021/jpeg/576791/1635700955228-f8beb5af-44da-4906-9ace-b36c5012651b.jpeg

前言

字节码我们都知道是java文件经过编译之后的class文件,每一个字节码文件都要由10部分按照固定的顺序组成;增强其实就是对字节码文件进行改造生成一个新的文件,已达到我们的目的,比如动态代理,AOP等;当然增强完需要能被使用,所以涉及到到加载的问题;在介绍之前我们先来看看都有哪些字节码增强技术。

常见技术

常见的字节码增强技术大致分为两类:静态增强和动态增强;静态增强最常见的就是AspectJ了,可以直接编译类,有自己的语法;动态增强包括:ASMJavassistCglibJava Proxy;下面分别做简单介绍。

AspectJ

AspectJ来自于Eclipse基金会,属于静态织入,主要采用的是编译期织入,在这个期间使用AspectJacj编译器(类似javac)把aspect类编译成class字节码;下面看一下AspectJ是如何使用的;

java -jar aspectj-1.9.6.jar

ASPECTJ_HOME=E:\\\\aspectj1.9
CLASSPATH=...%ASPECTJ_HOME%\\\\lib\\\\aspectjrt.jar
PATH=...%ASPECTJ_HOME%\\\\bin

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

ASM是一个通用的Java字节码操作和分析框架,它可以用来修改现有的类或直接以二进制形式动态生成类;ASM提供了一些常见的字节码转换和分析算法,从中可以构建定制的复杂转换和代码分析工具;几个核心的类: