新建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 实现字节码注入相关推荐

  1. internal java compiler error_java字节码注入AOP作业心得

    做的我心力憔悴,java太难了. 记录一下遇到的问题 导入别人的项目时,如果出现一大片error,首先检查是否导入JRE没有 如果是maven项目,记得加上maven Depedenies,右键项目- ...

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

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

  3. aop 获取方法入参出参_ASM字节码编程 | JavaAgent+ASM字节码插桩采集方法名称及入参和出参结果并记录方法耗时...

    作者:小傅哥 博客:bugstack.cn ❝ 沉淀.分享.成长,让自己和他人都能有所收获! ❞ 一.前言 在我们实际的业务开发到上线的过程中,中间都会经过测试.那么怎么来保证测试质量呢?比如:提交了 ...

  4. ASM字节码编程 | JavaAgent+ASM字节码插桩采集方法名称以及入参和出参结果并记录方法耗时

    作者:小傅哥 博客:bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在我们实际的业务开发到上线的过程中,中间都会经过测试.那么怎么来保证测试质量呢?比如:提交了多少代码 ...

  5. java字节码注入实现AOP-------LTW

    主要用到两个类ClassFileTransformer和Instrumentation然后自己研究吧

  6. java探针之修改类字节码文件

    java探针利用了javaAgent + ASM字节码注入工具实现了动态修改类文件的功能.像skywalking和arthas都使用到了这个技术. 具体原理为: jdk1.5以后引入了javaAgen ...

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

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

  8. 字节码编程,Byte-buddy篇二《监控方法执行耗时动态获取出入参类型和值》

    作者:小傅哥 博客:https://bugstack.cn - 汇总系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 案例是剥去外衣包装展示出核心功能的最佳学习方式! 就像是我们研 ...

  9. JVM 字节码从入门到精通

    小册介绍 也许你写了无数行代码,会用很多炫酷的语法糖和高级的框架,但你未必了解这些高级语言背后的执行过程.即使对于一名经验丰富的 Java 程序员,在阅读 Java 字节码的时候也会感到很枯燥.我们为 ...

最新文章

  1. 16岁上大学,25岁博士毕业,她还是南大医学院最年轻的博导!
  2. JS循环执行函数setInterval
  3. 微软再向开发者重申:UWP 是 PC 的最佳平台
  4. QLayout的属性介绍
  5. innobackupex做MySQL增量备份及恢复
  6. 浅谈测试职业的发展空间
  7. php mysql购物系统_基于PHPMySQL 的网上购物系统设计与实现
  8. recv函数linux,linux 下调用recv函数,死循环在recv函数里面,什么原因?
  9. 阿里云漏洞修复 RHSA-2019:0109-Important: perl secur
  10. linux磁盘分区详解
  11. Java多线程游戏-雷霆战机
  12. touchID 和 FaceID~2
  13. PVE下的黑群晖的其他后续设置
  14. 如何理解凸优化中的共轭函数的定义?
  15. AWS为什么能成功?
  16. 卓有成效的管理者——第5章 要事优先
  17. 当应酬成为日常,你需要这20个技巧聪明地进食
  18. 抛弃PDF,事实证明,个人主页更牛B!
  19. ZYNQ学习之路4.ZYNQ通过GP口读取PL内部RAM数据
  20. 世平信息参与2020计世传媒优秀安全企业线上展示

热门文章

  1. android 动画x轴旋转,Android Roate3dAnimation实现围绕y轴竖直方向或者绕x轴方向旋转的3d动画效果...
  2. 用java代码实现Singleton,为什么在Java代码中实现Singleton模式(有时被认为是Java世界中的反模式)?...
  3. python 图像iou_如何通过python实现IOU计算代码实例
  4. 如何启用计算机超级账户,win7如何启用超级管理员账户 win7启用超级管理员账户方法介绍...
  5. airflow sql_alchemy_conn mysql_airflow的安装和使用 - 完全版
  6. mysql客户端如何创建用户_mysql的创创建用户阶段 开启客户端登录和授权阶段
  7. java批量执行sql语句_Java中批量执行sql语句
  8. 少样本学习原理快速入门,并翻译《Free Lunch for Few-Shot Learning: Distribution Calibration》
  9. 【机器视觉案例】(9) AI视觉,手势控制电脑键盘,附python完整代码
  10. java 读取流的字符编码格式_如何使用Java代码获取文件、文件流或字符串的编码方式...