JavaAgent的简单例子

网友投稿 272 2023-01-20

JavaAgent的简单例子

javaAgent 是JDK 1.5 以后引入的,也可以叫做Java代理。

JavaAgent 是运行在 main方法之前的拦截器,它内定的方法名叫 premain ,也就是说先执行 premain 方法然后再执行 main 方法。

那么如何实现一个 JavaAgent 呢?很简单,只需要增加 premain 方法即可。

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

package com.shanhy.demo.agent;

import java.lang.instrument.Instrumentation;

/**

* 我的Java代理

*

* @author 单红宇(365384722)

* @myblog http://blog.csdn.net/catoop/

* @create 2016年3月30日

*/

public class MyAgent {

/**

* 该方法在main方法之前运行,与main方法运行在同一个JVM中

* 并被同一个System ClassLoader装载

* 被统一的安全策略(security policy)和上下文(context)管理

*

* @param agentOps

* @param inst

* @author SHANHY

* @create 2016年3月30日

*/

public static void premain(String agentOps, Instrumentation inst) {

System.out.println("=========premain方法执行========");

System.out.println(agentOps);

}

/**

* 如果不存在 premain(String agentOps, Instrumentation inst)

* 则会执行 premain(String agentOps)

*

* @param agentOps

* @authttp://hor SHANHY

* @create 2016年3月30日

*/

public static void premain(String agentOps) {

System.out.println("=========premain方法执行2========");

System.out.println(agentOps);

}

}

写完这个类后,我们还需要做一步配置工作。

在 src 目录下添加 META-INF/MANIFEST.MF 文件,内容按如下定义:

Manifest-Version: 1.0

Premain-Class: com.shanhy.demo.agent.MyAgent

Can-Redefine-Classes: true

要特别注意,一共是四行,第四行是空行,还有就是冒号后面的一个空格,如下截图:

然后我们打包代码为 myagent.jar

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

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

然后将该主程序打包为 myapp.jar

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

命令如下:

java -javaagent:G:\myagent.jar=Hello1

-javaagent:G:\myagent.jar=Hello2

-javaagent:G:\myagent.jar=Hello3 -jar myapp.jar

输出结果:

G:\>java -javaagent:G:\myagent.jar=Hello1 -javaagent:G:\myagent.jar=Hello2 -javaagent:G:\myagent.jar=Hello3 -jar myapp.jar

=========premain方法执行========

Hello1

=========premain方法执行========

Hello2

=========premain方法执行========

Hello3

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

比如执行:

java -javaagent:G:\myagent.jar=Hello1

-javaagent:G:\myagent.jar=Hello2 -jar myapp.jar

-javaagent:G:\myagent.jar=Hello3

只会有前个生效,第三个是无效的。

输出结果:

G:\>java -javaagent:G:\myagent.jar=Hello1 -javaagent:G:\myagent.jar=Hello2 -jar myapp.jar -javaagent:G:\myagent.jar=Hello3

=========premain方法执行========

Hello1

=========premain方法执行========

Hello2

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

至此,我们会使用 javaagent 了,但是单单看这样运行的效果,好像没有什么实际意义嘛。

我们可以用 javaagent 做什么呢?下篇文章我们来介绍如何在项目中应用 javaagent。

最后说一下,还有一种,在main方法执行后再执行代理的方法,因为不常用,而且主程序需要配置 Agent-Class,所以不常用,如果需要自行了解下 agentmain(String agentArgs, Instrumentation inst) 方法。

以上就是JavaAgent的简单例子的详细内容,更多关于JavaAgent的资料请关注我们其它相关文章!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:糯米电影api(糯米电影票房排行榜)
下一篇:IDEA创建MyBatis配置文件模板的方法步骤
相关文章

 发表评论

暂时没有评论,来抢沙发吧~