JavaAgent 简单例子

青旅半醒 2022-05-29 02:43 407阅读 0赞

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

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

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

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

  1. package com.shanhy.demo.agent;
  2. import java.lang.instrument.Instrumentation;
  3. /** * 我的Java代理 * * @author 单红宇(365384722) * @myblog http://blog.csdn.net/catoop/ * @create 2016年3月30日 */
  4. public class MyAgent {
  5. /** * 该方法在main方法之前运行,与main方法运行在同一个JVM中 * 并被同一个System ClassLoader装载 * 被统一的安全策略(security policy)和上下文(context)管理 * * @param agentOps * @param inst * @author SHANHY * @create 2016年3月30日 */
  6. public static void premain(String agentOps, Instrumentation inst) {
  7. System.out.println("=========premain方法执行========");
  8. System.out.println(agentOps);
  9. }
  10. /** * 如果不存在 premain(String agentOps, Instrumentation inst) * 则会执行 premain(String agentOps) * * @param agentOps * @author SHANHY * @create 2016年3月30日 */
  11. public static void premain(String agentOps) {
  12. System.out.println("=========premain方法执行2========");
  13. System.out.println(agentOps);
  14. }
  15. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

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

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

  1. Manifest-Version: 1.0
  2. Premain-Class: com.shanhy.demo.agent.MyAgent
  3. Can-Redefine-Classes: true
  • 1
  • 2
  • 3
  • 4

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

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

注意打包的时候选择我们自己定义的 MANIFEST.MF
这里写图片描述


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

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


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

命令如下:

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

输出结果:

  1. G:\>java -javaagent:G:\myagent.jar=Hello1 -javaagent:G:\myagent.jar=Hello2 -javaagent:G:\myagent.jar=Hello3 -jar myapp.jar
  2. =========premain方法执行======== Hello1
  3. =========premain方法执行======== Hello2
  4. =========premain方法执行======== Hello3
  5. =========main方法执行========
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

比如执行:

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

只会有前个生效,第三个是无效的。
输出结果:

  1. G:\>java -javaagent:G:\myagent.jar=Hello1 -javaagent:G:\myagent.jar=Hello2 -jar myapp.jar -javaagent:G:\myagent.jar=Hello3
  2. =========premain方法执行======== Hello1
  3. =========premain方法执行======== Hello2
  4. =========main方法执行========
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

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


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

发表评论

表情:
评论列表 (有 0 条评论,407人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JavaAgent简介

    JavaAgent是一种Java技术,它允许在Java应用程序运行时修改字节码。它可以被用来监视和调试应用程序,也可以用于性能优化、安全检查等方面。JavaAgent通常作为一

    相关 如何设置 javaagent

    在Java应用程序中,可以使用Java代理(Java Agent)来在运行时修改或增强字节码,从而实现各种功能,例如性能监控、日志记录、代码注入等。下面是设置Java代理的一般

    相关 Spring简单例子

    1.引入包 强烈建议,学习使用下maven及类似依赖包管理工具,如果你以后学Java,基本上会用到的吧 maven:在pom添加依赖: <dependenc