字节码增强技术是什么
1.对现有字节码进行修改; 2.或者 动态生成全新字节码文件.
为什么需要字节码增强技术,能做什么
字节码增强技术有哪些,分别的实现,优缺点
![[20210831212739.png| 字节码增强技术]]
ASM 在指令层次上操作字节码. 可以直接生成.class 字节码文件. 通过访问者模式操作字节码文件. 访问者模式: 主要用于修改或操作一些数据结构比较稳定的数据 . 分为 core api (类似于xml中的sax方式,速度快)和 tree api(类似于xml中的dom方式). idea插件ASM ByteCode Outline可以查看当前类的代码对应的asm写法.
Javassist 在源代码层次操作字节码.
JVM默认是不允许在运行时动态重载一个类的. 期望:在一个持续运行并已经加载了所有类的JVM中,还能利用字节码增强技术对其中的类行为做替换并重新加载。
Instrument
Instrument是什么? instrument是JVM提供的一个可以修改已加载类 的类库
为什么需要Instrument?
Instrument怎么使用? 要使用instrument的类修改功能,我们需要实现它提供的ClassFileTransformer接口,定义一个类文件转换器。 接口中的transform()方法会在类文件被加载时调用,而在transform方法里, 我们可以利用上文中的ASM或Javassist对传入的字节码进行改写或替换,生成新的字节码数组后返回。
需要借助Agent的能力将Instrument注入到JVM中.
Instrument如何实现? 依赖JVMTI的Attach API机制实现
JPDA(Java Platform Debugger Architecture)
若JVM启动时开启了JPDA,那么类是允许被重新加载的. 在这种情况下,已被加载的旧版本类信息可以被卸载,然后重新加载新版本的类. JPDA组成: 1.Java 虚拟机工具接口(JVMTI);2.Java 调试协议(JDWP); 3.Java 调试接口(JDI)
JVMTI & Agent & Attach API
JVM TI(JVM TOOL INTERFACE,JVM工具接口): 是JVM提供的一套对JVM进行操作的工具接口
Agent: 是JVMTI的一种实现 Agent有两种启动方式: 1.随Java进程启动而启动,如java -agentlib 就是这种方式; 2.运行时载入,通过attach API将模块(jar包)动态地Attach到指定进程id的Java进程内 。
Attach API 作用: 提供JVM进程间通信的能力.
|