概述

字节码增强技术 有 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相关推荐

  1. 探针技术-JavaAgent 和字节码增强技术-Byte Buddy

    能够基于Java Agent编写出普通类的代理 理解Byte Buddy的作用 能够基于Byte Buddy编写动态代理 1 Byte Buddy Byte Buddy 是一个代码生成和操作库,用于在 ...

  2. JVM插桩之一:JVM字节码增强技术介绍及入门示例

    字节码增强技术:AOP技术其实就是字节码增强技术,JVM提供的动态代理追根究底也是字节码增强技术. 目的:在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修 ...

  3. ASM字节码编程 | 用字节码增强技术给所有方法加上TryCatch捕获异常并输出

    作者:小傅哥 博客:https://bugstack.cn Wiki:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有所收 ...

  4. Java字节码增强技术

    文章目录 字节码 字节码增强 字节码增强技术 字节码 字节码含义:待补充. Java为了能让Java程序编译一次到处运行,用Java 编译器将程序对源代码编译生成固定格式的字节码(.class文件)供 ...

  5. idea如何反编译字节码指令_美团点评:Java字节码增强技术,线上问题诊断利器...

    作者简介:泽恩,美团到店住宿业务研发团队工程师.文章转载于公众号:美团技术团队 1. 字节码 1.1 什么是字节码? Java之所以可以"一次编译,到处运行",一是因为JVM针对各 ...

  6. javassist字节码增强技术

    一.前言: 简单理解就是在原来方法的前后添加新的代码(扩展之前方法的代码) 这个是springAOP切面的基础 (springAOP切面就是给原有代码前后增加新代码)(为了更方便扩充新功能<只编 ...

  7. JAVA字节码增强技术之ASM

    ASM是一款基于java字节码层面的代码分析和修改工具:无需提供源代码即可对应用嵌入所需debug代码,用于应用API性能分析,代码优化和代码混淆等工作.ASM的目标是生成,转换和分析已编译的java ...

  8. python字节码解析_从底层入手,解析字节码增强和Btrace应用

    这篇文章聊下字节码和相关的应用. 1.机器码和字节码 机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据. 通常意义上来 ...

  9. 干货!Java字节码增强探秘

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"获取公众号专属群聊入口 来源:美团技术团队 1. 字节码 1.1 什么是字节码? ...

最新文章

  1. python画图哆啦a梦-Python—turtle画图(哆啦A梦)
  2. 智能门锁中CPU卡加密
  3. Java输入输出(标准)
  4. 用神经网络分类连续与离散
  5. 程序员数学基础【一、基础运算符号(整数、普通浮点数运算、逻辑运算)】(Python版本)
  6. 如何查看光驱硬盘托架的尺寸_如何确定光驱位的硬盘托架的大小尺寸和接口
  7. skynet.fork_Apache Ant 1.10.6发布–用于junitlauncher的fork模式以及新的jmod和链接任务
  8. 寫程式不需要天份,也不需要熱情
  9. 适用于连续资源块的数组空闲链表的算法
  10. StringUtils工具类常用方法汇总1(判空、转换、移除、替换、反转)
  11. 留言板php数据库_PHP 留言板教程数据库表设计
  12. 学习笔记20 热传导方程
  13. qcc3020定制、qcc3020软件开发tws耳机的注意事项
  14. luov之IT管理制度
  15. iOS 15:Spotlight 搜索中的所有新功能
  16. vscode误更新后,无法连接服务器,报“Acquiring lock on/home/~”和“过程试图写入的管道不存在”错误
  17. 分析流量对防御DDOS攻击有何价值?
  18. 计算机和信息技术革命,人类历史上的四次信息技术革命
  19. 数字图像学笔记——3.彩色转黑白
  20. python开发一个复杂的网站_用Python的SimPy库简化复杂的编程模型的介绍

热门文章

  1. python获取当前日期的前一天_【python】datetime获取日期,前一天日期
  2. ctfshow-web入门-node.js
  3. 环洋市场调研-2021年全球企业估值服务行业调研及趋势分析报告
  4. 北斗GPS同步时钟(授时系统)技术原理详解
  5. 软件性能测试参数化数据准备,性能测试之如何准备测试数据
  6. 2to3:python2自动转python3
  7. win10卸载电脑管家就蓝屏_99%的电脑都有的win10蓝屏问题,两步就能解决!
  8. 聊聊chatbot那些事
  9. nRF24L01无线通信模块使用简介(接收端)
  10. Oracle11g数据库的下载与安装