gpt4 book ai didi

JavaAgent的简单例子

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章JavaAgent的简单例子由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

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

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

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

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

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

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

JavaAgent的简单例子

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

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

JavaAgent的简单例子

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

JavaAgent的简单例子

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

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

命令如下:

  1. java -javaagent:G:\myagent.jar=Hello1
  2. -javaagent:G:\myagent.jar=Hello2
  3. -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 是无效的.

比如执行:

  1. java -javaagent:G:\myagent.jar=Hello1
  2. -javaagent:G:\myagent.jar=Hello2 -jar myapp.jar
  3. -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的资料请关注我其它相关文章! 。

原文链接:https://blog.csdn.net/catoop/article/details/51034739 。

最后此篇关于JavaAgent的简单例子的文章就讲到这里了,如果你想了解更多关于JavaAgent的简单例子的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com