不知道javaagent是什么,运行个hello world就知道了
2020/3/11 17:01:34
本文主要是介绍不知道javaagent是什么,运行个hello world就知道了,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
从事java开发的同学,或多或少听说过java探针
/javaagent
这个术语。本文不说它的定义,不说它的原理,不说它的高大上的作用,只说它的"hello world"。即运行一个最简单的例子,实际看看效果,真切的感受后,才能真切清晰的入口。
编码
用idea创建个maven项目,如下图,项目名称随意,这里我的项目名为:microservice-comb-javaagent
代码如下 首先,创建一个类:AgentDemo
public class AgentDemo { /** * 该方法在main方法之前运行,与main方法运行在同一个JVM中 */ public static void premain(String agentArgs, Instrumentation inst) { System.out.println("------ premain方法 有两个入参 ------ agentArgs:" + agentArgs + " inst:" + inst.toString()); } /** * 如果不存在 {@link AgentDemo#premain(String, Instrumentation)}, 则会执行本方法 */ public static void premain(String agentArgs) { System.out.println("------ premain方法,有一个入参 ------ agentArgs:" + agentArgs); } } 复制代码
注意:AgentDemo的全限定名会在pom.xml中标签Premain-Class
引用
其次,再创建一个类:AgentTest
public class AgentTest { public static void main(String[] args) { System.out.println(" ------ main方法"); } } 复制代码
再次,在项目的pom.xml中添加
··· 略 <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-jar-plugin</artifactId> <configuration> <archive> <manifestEntries> <!-- 值为包含premain方法的类. 启动方式为命令行启动时,javaagent JAR文件清单必须包含 Premain-Class 属性, 代理类必须实现 public static premain()--> <Premain-Class>com.skyler.cobweb.agent.AgentDemo</Premain-Class> <Can-Redefine-Classes>true</Can-Redefine-Classes> <Can-Retransform-Classes>true</Can-Retransform-Classes> </manifestEntries> </archive> </configuration> </plugin> </plugins> </build> 复制代码
打jar包
将microservice-comb-javaagent
打成jar
包。运行时会使用这个Jar
包.打包命令:mvn clean package
。结果如下图
运行
你可以有两个运行方式:idea中直接运行
和命令行运行
- idea中直接运行
需要配置下项目的运行配置的VM options
,如下图,形式为-javaagent:jarpath[=options]
; 我的内容为:-javaagent:/Users/xx/microservice-comb/microservice-comb-javaagent/target/microservice-comb-javaagent-1.0.0-SNAPSHOT.ar="hello world"
然后,运行AgentTest.main方法,结果如下图
可以看到,打印出了AgentDemo.premain方法的信息
- 命令行运行
cd
到项目microservice-comb-javaagent的/target/classes路径下
$ cd xx/target/classes $ java -javaagent:/Users/xx/microservice-comb/microservice-comb-javaagent/target/microservice-comb-javaagent-1.0.0-SNAPSHOT.jar="hello world" com.skyler.cobweb.agent.AgentTest 复制代码
可以看到,同样打印出了AgentDemo.premain方法的信息
收获
这里有个对比,运行时是否加上-javaagent:jar
,这个给你的感受会很明显和透彻。来再操作下
加上时
$ cd /Users/xx/microservice-comb/microservice-comb-javaagent/target/classes $ java -javaagent:/Users/xx/microservice-comb/microservice-comb-javaagent/target/microservice-comb-javaagent-1.0.0-SNAPSHOT.jar="hello world" com.skyler.cobweb.agent.AgentTest 复制代码
效果
------ premain方法 有两个入参 ------ agentArgs:hello world inst:sun.instrument.InstrumentationImpl@a09ee92 ------ main方法 复制代码
不加上时
$ cd /Users/xx/microservice-comb/microservice-comb-javaagent/target/classes $ java com.skyler.cobweb.agent.AgentTest 复制代码
效果
------ main方法 复制代码
效果还是很明显的,不加-javaagent,jar里的类方法没有执行,也即不会输出信息
这个对比的目的是突出javaagent的作用。并让你清晰的感受javaagent的作用:像代理一样可以在main方法前做些事情,官方的说字节码增强。通过修改字节码的方式,让开发者有机会做些事情,如arthas 和skywalking的建监听组件
千言万语抵不上run
一个'hello world'
本文想通过最简单、最直观的方式,让你最快速的、最真切的了解javaagent的作用。下篇展开说javaagent的原理和更实际的使用例子
这篇关于不知道javaagent是什么,运行个hello world就知道了的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求
- 2024-10-01使用 golang 将ETH账户的资产平均分散到其他账户
- 2024-10-01JWT用户校验课程:从入门到实践
- 2024-10-01Server Component课程入门指南
- 2024-09-30Dnd-Kit学习:新手快速入门指南