字节码增强技术 Byte Buddy 、Javassist、Instrumentation
概述
字节码增强技术 有 Byte Buddy 、Javassist等多种。
- 如果是在同一个包中,没有问题,不需借助Instrumentation
- 如果是第三方包,想不修改代码的情况下实现代理技术,就可以采用Instrumentation进行引入
1. Instrumentation
什么是Instrumentation?
java Instrumentation指的是可以用独立于应用程序之外的代理(agent)程序来监测和协助运行在JVM上的应用程序。这种监测和协助包括但不限于获取JVM运行时状态,替换和修改类定义等。 Java SE5中使用JVM TI替代了JVM PI和JVM DI。提供一套代理机制,支持独立于JVM应用程序之外的程序以代理的方式连接和访问JVM。java.lang.instrument是在JVM TI的基础上提供的Java版本的实现。 Instrumentation提供的主要功能是修改jvm中类的行为。 Java SE6中由两种应用Instrumentation的方式,premain(命令行)和agentmain(运行时)
premain方式
在Java SE5时代,Instrument只提供了premain一种方式,即在真正的应用程序(包含main方法的程序)main方法启动前启动一个代理程序。例如使用如下命令:
java -javaagent:agent_jar_path[=options] java_app_name
2. Javassist
ClassFileTransformer接口
一个代理实现ClassFileTransformer接口用于改变运行时的字节码(class File),这个改变发生在jvm加载这个类之前。对所有的类加载器有效。
class File这个术语定义于虚拟机规范3.1,指的是字节码的byte数组,而不是文件系统中的class文件。
接口中只有一个方法:
byte[]transform( ClassLoader loader,String className,Class<?> classBeingRedefined,ProtectionDomain protectionDomain,byte[] classfileBuffer)throws IllegalClassFormatException;
一个示例:
public class PerformMonitorTransformer implements ClassFileTransformer {@Overridepublic byte[] transform(ClassLoader loader,String className,Class<?> classBeingRedefined,ProtectionDomain protectionDomain,byte[] classfileBuffer) throws IllegalClassFormatException {// todo完成业务逻辑}
}
ClassFileTransformer接口如何生效
ClassFileTransformer需要添加到Instrumentation实例中才能生效
。
获取Instrumentation实例的方法有2种:
- 虚拟机启动时,通过agent class的premain方法获得
- 虚拟机启动后,通过agent class的agentmain方法获得
需要在premain暴露ClassFileTransformer接口的实现类:
public class FoxAgent {public static void premain(String args, Instrumentation instrumentation){System.out.println("premain:获取方法调用时间");// 添加 TransformerClassFileTransformer transformer = new PerformMonitorTransformer();instrumentation.addTransformer(transformer);}
}
通过这个 -javaagent:jarpath[=options]
参数,启动实际应用,就会自带agent。如果agent启动失败,jvm会终止。
3. Byte Buddy
Byte Buddy 是一个代码生成和操做库,用于在Java应用程序运行时建立和修改Java类,而无需编译器的帮助。除了Java类库附带的代码生成实用程序外,Byte Buddy还容许建立任意类,而且不限于实现用于建立运行时代理的接口。此外,Byte Buddy提供了一种方便的API,可使用Java代理或在构建过程当中手动更改类。Byte Buddy 相比其余字节码操做库有以下优点:
- 无需理解字节码格式,便可操做,简单易行的 API 能很容易操做字节码。
- 支持 Java 任何版本,库轻量,仅取决于Java字节代码解析器库ASM的访问者API,它自己不须要任何其余依赖项。
- 比起JDK动态代理、cglib、Javassist,Byte Buddy在性能上具备优点。
参考
Instrumentation与ClassFileTransformer–字节码转换工具
字节码加强技术-Byte Buddy
JAVA Instrumentation
字节码增强技术 Byte Buddy 、Javassist、Instrumentation相关推荐
- 探针技术-JavaAgent 和字节码增强技术-Byte Buddy
能够基于Java Agent编写出普通类的代理 理解Byte Buddy的作用 能够基于Byte Buddy编写动态代理 1 Byte Buddy Byte Buddy 是一个代码生成和操作库,用于在 ...
- JVM插桩之一:JVM字节码增强技术介绍及入门示例
字节码增强技术:AOP技术其实就是字节码增强技术,JVM提供的动态代理追根究底也是字节码增强技术. 目的:在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修 ...
- ASM字节码编程 | 用字节码增强技术给所有方法加上TryCatch捕获异常并输出
作者:小傅哥 博客:https://bugstack.cn Wiki:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有所收 ...
- Java字节码增强技术
文章目录 字节码 字节码增强 字节码增强技术 字节码 字节码含义:待补充. Java为了能让Java程序编译一次到处运行,用Java 编译器将程序对源代码编译生成固定格式的字节码(.class文件)供 ...
- idea如何反编译字节码指令_美团点评:Java字节码增强技术,线上问题诊断利器...
作者简介:泽恩,美团到店住宿业务研发团队工程师.文章转载于公众号:美团技术团队 1. 字节码 1.1 什么是字节码? Java之所以可以"一次编译,到处运行",一是因为JVM针对各 ...
- javassist字节码增强技术
一.前言: 简单理解就是在原来方法的前后添加新的代码(扩展之前方法的代码) 这个是springAOP切面的基础 (springAOP切面就是给原有代码前后增加新代码)(为了更方便扩充新功能<只编 ...
- JAVA字节码增强技术之ASM
ASM是一款基于java字节码层面的代码分析和修改工具:无需提供源代码即可对应用嵌入所需debug代码,用于应用API性能分析,代码优化和代码混淆等工作.ASM的目标是生成,转换和分析已编译的java ...
- python字节码解析_从底层入手,解析字节码增强和Btrace应用
这篇文章聊下字节码和相关的应用. 1.机器码和字节码 机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据. 通常意义上来 ...
- 干货!Java字节码增强探秘
点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"获取公众号专属群聊入口 来源:美团技术团队 1. 字节码 1.1 什么是字节码? ...
最新文章
- python画图哆啦a梦-Python—turtle画图(哆啦A梦)
- 智能门锁中CPU卡加密
- Java输入输出(标准)
- 用神经网络分类连续与离散
- 程序员数学基础【一、基础运算符号(整数、普通浮点数运算、逻辑运算)】(Python版本)
- 如何查看光驱硬盘托架的尺寸_如何确定光驱位的硬盘托架的大小尺寸和接口
- skynet.fork_Apache Ant 1.10.6发布–用于junitlauncher的fork模式以及新的jmod和链接任务
- 寫程式不需要天份,也不需要熱情
- 适用于连续资源块的数组空闲链表的算法
- StringUtils工具类常用方法汇总1(判空、转换、移除、替换、反转)
- 留言板php数据库_PHP 留言板教程数据库表设计
- 学习笔记20 热传导方程
- qcc3020定制、qcc3020软件开发tws耳机的注意事项
- luov之IT管理制度
- iOS 15:Spotlight 搜索中的所有新功能
- vscode误更新后,无法连接服务器,报“Acquiring lock on/home/~”和“过程试图写入的管道不存在”错误
- 分析流量对防御DDOS攻击有何价值?
- 计算机和信息技术革命,人类历史上的四次信息技术革命
- 数字图像学笔记——3.彩色转黑白
- python开发一个复杂的网站_用Python的SimPy库简化复杂的编程模型的介绍
热门文章
- python获取当前日期的前一天_【python】datetime获取日期,前一天日期
- ctfshow-web入门-node.js
- 环洋市场调研-2021年全球企业估值服务行业调研及趋势分析报告
- 北斗GPS同步时钟(授时系统)技术原理详解
- 软件性能测试参数化数据准备,性能测试之如何准备测试数据
- 2to3:python2自动转python3
- win10卸载电脑管家就蓝屏_99%的电脑都有的win10蓝屏问题,两步就能解决!
- 聊聊chatbot那些事
- nRF24L01无线通信模块使用简介(接收端)
- Oracle11g数据库的下载与安装