博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaAgent入门
阅读量:4973 次
发布时间:2019-06-12

本文共 2224 字,大约阅读时间需要 7 分钟。

JavaAgent 是JDK 1.5 以后引入的,也可以叫做Java代理。
JavaAgent 是运行在 main方法之前的拦截器,它内定的方法名叫 premain ,也就是说先执行 premain 方法然后再执行 main 方法。
那么如何实现一个 JavaAgent 呢?很简单,只需要增加 premain 方法即可。

看下面的代码和代码中的注释说明:

MyAgent.jar

package com.demo.test;import java.lang.instrument.Instrumentation;/** * Java代理 */public class MyAgent {    /**     * 该方法在main方法之前运行,与main方法运行在同一个JVM中     * 并被同一个System ClassLoader装载     * 被统一的安全策略(security policy)和上下文(context)管理     */    public static void premain(String agentOps, Instrumentation inst) {        System.out.println("=========premain方法执行========");        System.out.println(agentOps);    }    /**     * 如果不存在 premain(String agentOps, Instrumentation inst)      * 则会执行 premain(String agentOps)     */    public static void premain(String agentOps) {        System.out.println("=========premain方法执行2========");        System.out.println(agentOps);    }}

写完这个类后,我们还需要做一步配置工作。
在 src 目录下添加 META-INF/MANIFEST.MF 文件,内容按如下定义:

MANIFEST.MF

Manifest-Version: 1.0Premain-Class: com.demo.test.MyAgentCan-Redefine-Classes: true
要特别注意,一共是四行,第四行是空行,还有就是冒号后面的一个空格,如下截图: 

注意打包的时候选择我们自己定义的 MANIFEST.MF 

接着我们在创建一个带有main方法的主程序工程,截图如下: 

   

MyProgram.java

package com.demo.test;public class MyProgram {	/**	 * @param args	 */	public static void main(String[] args) {		// TODO Auto-generated method stub		System.out.println("=========main方法执行=============");	}}
MANIFEST.MF

Manifest-Version: 1.0Main-Class: com.demo.test.MyProgramCan-Redefine-Classes: true
然后将该主程序打包为 myapp.jar

如何执行 myagent.jar ?我们通过 -javaagent 参数来指定我们的Java代理包,值得一说的是 -javaagent 这个参数的个数是不限的,如果指定了多个,则会按指定的先后执行,执行完各个 agent 后,才会执行主程序的 main 方法。

java -javaagent:myagent.jar=Hello1 -javaagent:myagent.jar=Hello2 -javaagent:myagent.jar=Hello3 -jar myapp.jar
输出结果:

特别提醒:如果你把 -javaagent 放在 -jar 后面,则不会生效。也就是说,放在主程序后面的 agent 是无效的。

比如执行:

java -javaagent:myagent.jar=Hello1 -javaagent:myagent.jar=Hello2 -jar myapp.jar -javaagent:myagent.jar=Hello3
只会有前个生效,第三个是无效的。 
输出结果:

命令中的Hello1为我们传递给 premain 方法的字符串参数。

至此,我们会使用 javaagent 了,但是单单看这样运行的效果,好像没有什么实际意义嘛。
我们可以用 javaagent 做什么呢?下篇文章我们来介绍如何在项目中应用 javaagent。
最后说一下,还有一种,在main方法执行后再执行代理的方法,因为不常用,而且主程序需要配置 Agent-Class,所以不常用,如果需要自行了解下 agentmain(String agentArgs, Instrumentation inst) 方法。

转载于:https://www.cnblogs.com/beautiful-code/p/6442841.html

你可能感兴趣的文章
Windows c++应用程序通用日志组件(组件及测试程序下载)
查看>>
openstack dpdk
查看>>
springmvc跳转方式
查看>>
Linux安装Redis
查看>>
IOS 第三方管理库管理 CocoaPods
查看>>
背景色渐变(兼容各浏览器)
查看>>
Redis中7种集合类型应用场景
查看>>
MariaDB 和 MySQL 比较
查看>>
MYSQL: 1292 - Truncated incorrect DOUBLE value: '184B3C0A-C411-47F7-BE45-CE7C0818F420'
查看>>
Java JPA @Transient 在Hibernate中应用
查看>>
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
查看>>
springMVC Controller 参数映射
查看>>
JDK1.8源码分析02之阅读源码顺序
查看>>
java使用jsp servlet来防止csrf 攻击的实现方法
查看>>
缓存穿透/击穿/雪崩/降级
查看>>
我的作品
查看>>
【bzoj题解】2186 莎拉公主的困惑
查看>>
Protocol Buffer学习笔记
查看>>
Update 语句
查看>>
HBuilder打包Android apk 支付不了问题解决
查看>>