JavaAgent 实现字节码注入
新建MyAgent项目
pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.book.MyAgent</groupId><artifactId>MyAgent</artifactId><version>1.0</version><dependencies><dependency><groupId>javassist</groupId><artifactId>javassist</artifactId><version>3.12.1.GA</version></dependency><dependency><groupId>org.ow2.asm</groupId><artifactId>asm-all</artifactId><version>5.1</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><version>3.0.1</version><executions><execution><id>attach-sources</id><phase>verify</phase><goals><goal>jar-no-fork</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>2.6</version><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><archive><manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile></archive></configuration><executions><execution><id>assemble-all</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins><resources><resource><directory>${basedir}/src/main/resources</directory></resource><resource><directory>${basedir}/src/main/java</directory></resource></resources></build>
</project>
AgentMain.java
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
import java.security.ProtectionDomain;public class AgentMain {public static void premain(String agentOps, Instrumentation inst) {System.out.println("=========premain方法执行========");System.out.println(agentOps);//instrument(agentOps, inst);}public static void agentmain(String agentOps, Instrumentation inst) {instrument(agentOps, inst);}
src\main\resources\META-INF下新建MANIFEST.MF
Manifest-Version: 1.0
Premain-Class: com.book.myagent.AgentMain
Agent-Class: com.book.myagent.AgentMain
Can-Redefine-Classes: true
注意会生成3个jar
新建第二个项目Test:
package com.book.test;public class HelloWorld {public static void main(String[] arg) {System.out.println("输出>>>HelloWorld");}
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.book</groupId><artifactId>Test</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><build><plugins><plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <appendAssemblyId>false</appendAssemblyId> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.book.test.HelloWorld</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>assembly</goal> </goals> </execution> </executions> </plugin></plugins></build>
</project>
java -javaagent:E:\worktest\MyAgent\target\MyAgent-1.0-jar-with-dependencies.jar -jar E:\worktest\Test\target\Test-1.0-SNAPSHOT.jar com.book.test.HelloWorld
执行:
java -javaagent:E:\worktest\MyAgent\target\MyAgent-1.0-jar-with-dependencies.jar -jar E:\worktest\Test\target\Test-1.0-SNAPSHOT.jar com.book.test.HelloWorld
注意不在pom设置默认主类可以用 java -cp启动
参考:https://github.com/liuzhengyang/javaagent-example
https://blog.csdn.net/catoop/article/details/51034739
JavaAgent 实现字节码注入相关推荐
- internal java compiler error_java字节码注入AOP作业心得
做的我心力憔悴,java太难了. 记录一下遇到的问题 导入别人的项目时,如果出现一大片error,首先检查是否导入JRE没有 如果是maven项目,记得加上maven Depedenies,右键项目- ...
- 探针技术-JavaAgent 和字节码增强技术-Byte Buddy
能够基于Java Agent编写出普通类的代理 理解Byte Buddy的作用 能够基于Byte Buddy编写动态代理 1 Byte Buddy Byte Buddy 是一个代码生成和操作库,用于在 ...
- aop 获取方法入参出参_ASM字节码编程 | JavaAgent+ASM字节码插桩采集方法名称及入参和出参结果并记录方法耗时...
作者:小傅哥 博客:bugstack.cn ❝ 沉淀.分享.成长,让自己和他人都能有所收获! ❞ 一.前言 在我们实际的业务开发到上线的过程中,中间都会经过测试.那么怎么来保证测试质量呢?比如:提交了 ...
- ASM字节码编程 | JavaAgent+ASM字节码插桩采集方法名称以及入参和出参结果并记录方法耗时
作者:小傅哥 博客:bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在我们实际的业务开发到上线的过程中,中间都会经过测试.那么怎么来保证测试质量呢?比如:提交了多少代码 ...
- java字节码注入实现AOP-------LTW
主要用到两个类ClassFileTransformer和Instrumentation然后自己研究吧
- java探针之修改类字节码文件
java探针利用了javaAgent + ASM字节码注入工具实现了动态修改类文件的功能.像skywalking和arthas都使用到了这个技术. 具体原理为: jdk1.5以后引入了javaAgen ...
- JVM插桩之一:JVM字节码增强技术介绍及入门示例
字节码增强技术:AOP技术其实就是字节码增强技术,JVM提供的动态代理追根究底也是字节码增强技术. 目的:在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修 ...
- 字节码编程,Byte-buddy篇二《监控方法执行耗时动态获取出入参类型和值》
作者:小傅哥 博客:https://bugstack.cn - 汇总系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 案例是剥去外衣包装展示出核心功能的最佳学习方式! 就像是我们研 ...
- JVM 字节码从入门到精通
小册介绍 也许你写了无数行代码,会用很多炫酷的语法糖和高级的框架,但你未必了解这些高级语言背后的执行过程.即使对于一名经验丰富的 Java 程序员,在阅读 Java 字节码的时候也会感到很枯燥.我们为 ...
最新文章
- 16岁上大学,25岁博士毕业,她还是南大医学院最年轻的博导!
- JS循环执行函数setInterval
- 微软再向开发者重申:UWP 是 PC 的最佳平台
- QLayout的属性介绍
- innobackupex做MySQL增量备份及恢复
- 浅谈测试职业的发展空间
- php mysql购物系统_基于PHPMySQL 的网上购物系统设计与实现
- recv函数linux,linux 下调用recv函数,死循环在recv函数里面,什么原因?
- 阿里云漏洞修复 RHSA-2019:0109-Important: perl secur
- linux磁盘分区详解
- Java多线程游戏-雷霆战机
- touchID 和 FaceID~2
- PVE下的黑群晖的其他后续设置
- 如何理解凸优化中的共轭函数的定义?
- AWS为什么能成功?
- 卓有成效的管理者——第5章 要事优先
- 当应酬成为日常,你需要这20个技巧聪明地进食
- 抛弃PDF,事实证明,个人主页更牛B!
- ZYNQ学习之路4.ZYNQ通过GP口读取PL内部RAM数据
- 世平信息参与2020计世传媒优秀安全企业线上展示
热门文章
- android 动画x轴旋转,Android Roate3dAnimation实现围绕y轴竖直方向或者绕x轴方向旋转的3d动画效果...
- 用java代码实现Singleton,为什么在Java代码中实现Singleton模式(有时被认为是Java世界中的反模式)?...
- python 图像iou_如何通过python实现IOU计算代码实例
- 如何启用计算机超级账户,win7如何启用超级管理员账户 win7启用超级管理员账户方法介绍...
- airflow sql_alchemy_conn mysql_airflow的安装和使用 - 完全版
- mysql客户端如何创建用户_mysql的创创建用户阶段 开启客户端登录和授权阶段
- java批量执行sql语句_Java中批量执行sql语句
- 少样本学习原理快速入门,并翻译《Free Lunch for Few-Shot Learning: Distribution Calibration》
- 【机器视觉案例】(9) AI视觉,手势控制电脑键盘,附python完整代码
- java 读取流的字符编码格式_如何使用Java代码获取文件、文件流或字符串的编码方式...