JavaAgent 简单例子
2016-04-01 10:29
453 查看
JavaAgent 是JDK 1.5 以后引入的,也可以叫做Java代理。
JavaAgent 是运行在 main方法之前的拦截器,它内定的方法名叫 premain ,也就是说先执行 premain 方法然后再执行 main 方法。
那么如何实现一个 JavaAgent 呢?很简单,只需要增加 premain 方法即可。
看下面的代码和代码中的注释说明:
写完这个类后,我们还需要做一步配置工作。
在 src 目录下添加 META-INF/MANIFEST.MF 文件,内容按如下定义:
要特别注意,一共是四行,第四行是空行,还有就是冒号后面的一个空格,如下截图:
然后我们打包代码为 myagent.jar
注意打包的时候选择我们自己定义的 MANIFEST.MF
接着我们在创建一个带有main方法的主程序工程,截图如下:
然后将该主程序打包为 myapp.jar
如何执行 myagent.jar ?我们通过 -javaagent 参数来指定我们的Java代理包,值得一说的是 -javaagent 这个参数的个数是不限的,如果指定了多个,则会按指定的先后执行,执行完各个 agent 后,才会执行主程序的 main 方法。
命令如下:
输出结果:
特别提醒:如果你把 -javaagent 放在 -jar 后面,则不会生效。也就是说,放在主程序后面的 agent 是无效的。
比如执行:
只会有前个生效,第三个是无效的。
输出结果:
命令中的Hello1为我们传递给 premain 方法的字符串参数。
至此,我们会使用 javaagent 了,但是单单看这样运行的效果,好像没有什么实际意义嘛。
我们可以用 javaagent 做什么呢?下篇文章我们来介绍如何在项目中应用 javaagent。
最后说一下,还有一种,在main方法执行后再执行代理的方法,因为不常用,而且主程序需要配置 Agent-Class,所以不常用,如果需要自行了解下 agentmain(String agentArgs, Instrumentation inst) 方法。
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 * @author 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 =========main方法执行========
特别提醒:如果你把 -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 =========main方法执行========
命令中的Hello1为我们传递给 premain 方法的字符串参数。
至此,我们会使用 javaagent 了,但是单单看这样运行的效果,好像没有什么实际意义嘛。
我们可以用 javaagent 做什么呢?下篇文章我们来介绍如何在项目中应用 javaagent。
最后说一下,还有一种,在main方法执行后再执行代理的方法,因为不常用,而且主程序需要配置 Agent-Class,所以不常用,如果需要自行了解下 agentmain(String agentArgs, Instrumentation inst) 方法。
相关文章推荐
- java并发之volatile变量
- 【hihocoder】hiho密码
- Java23种设计模式简介与原则
- Myeclipse 常用快捷键
- javap的使用
- Spring Security
- java 开发环境搭建
- 10 Ways to Learn Java in just a Couple of Weeks
- struts2 - execAndWait(拦截器实例)
- java怎么判断一个文本是什么编码格式以及运行在doc下,javadoc注释文档
- Java中的Enum的使用与分析
- eclipse快捷键
- 查看项目中哪些Java类用到了某个Jar包
- springMVC:java.io.FileNotFoundException: Could not open ServletContext resource
- Spring MVC controller间跳转 重定向 传参
- Java对象序列化
- java-过滤器-监听器-拦截器
- Java命令行运行参数说明大全(转载)
- java:如何用代码控制H2 Database启动
- JAVA 枚举