JavaAgent入门
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.0
- Premain-Class: com.demo.test.MyAgent
- Can-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.0
- Main-Class: com.demo.test.MyProgram
- Can-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) 方法。
JavaAgent入门的更多相关文章
- 八:Lombok 安装、入门 - 消除冗长的 java 代码
Lombok 安装.入门 - 消除冗长的 java 代码 前言: 逛开源社区的时候无意发现的,用了一段时间,觉得还可以,特此推荐一下. lombok 提供了简单的注解的形式来帮助我们简化消 ...
- MyBatis(1)——快速入门
MyBatis 简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...
- Python学习总结(一)—— 十分钟入门
一.Python概要 1.1.语言简介 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言,具有20多年的发展历史,成熟且稳定. 用任何编程语言来开发程序,都是为了让计算机干活,比如下 ...
- Python入门:Anaconda和Pycharm的安装和配置
Python入门:Anaconda和Pycharm的安装和配置 转自:https://www.cnblogs.com/yuxuefeng/articles/9235431.html 子曰:“工欲善其 ...
- Spring Boot 入门案例与配置说明
一.Spring Boot简介 官网地址:http://spring.io/projects/spring-boot Spring Boot可以轻松创建可以运行的独立的,生产级的基于Spring的应用 ...
- (转) MyBatis(1)——快速入门
MyBatis 简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...
- JVM插庄之一:JVM字节码增强技术介绍及入门示例
字节码增强技术:AOP技术其实就是字节码增强技术,JVM提供的动态代理追根究底也是字节码增强技术. 目的:在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修 ...
- 基于 Javassist 和 Javaagent 实现动态切面
一.背景介绍 1.需求说明 需求是在程序运行期间,向某个类的某个方法前.后加入某段业务代码,或者直接替换整个方法的业务逻辑,即业务方法客制化.注意是运行期间动态更改,做到无侵入,而不是事先在代码中写死 ...
- dubbo入门学习(二)-----dubbo hello world
一.dubbo hello world入门示例 1.提出需求 某个电商系统,订单服务需要调用用户服务获取某个用户的所有地址: 我们现在需要创建两个服务模块进行测试: 模块 功能 订单服务web模块 创 ...
随机推荐
- linux下命令行打开文件管理器
nautilus,这个太有用了,应为可以在secureCRT中使用,因为可以添加sudo来调用
- Linq 实现两个对象实例List之间的赋值
public class UserCopy { public class LoginEntity { public string UserName { get; set; } public strin ...
- Linux的wget命令
wget是linux最常用的下载命令, 一般的使用方法是: wget + 空格 + 要下载文件的url路径 例如: # wget http://www.linuxsense.org/xxxx/xxx. ...
- Windows 下 Chrome 快捷键大全
Windows 下 Chrome 快捷键大全,即 Google 浏览器的快捷键. 1 Ctrl+N 打开新窗口. 2 Ctrl+T 打开新标签页. 3 Ctrl+Shift+N 在隐身模式下打开新窗口 ...
- MongoDB 2.4企业版分析
作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs MongoDB v2.4版于3月19日发布,它引入了内置的文本搜索功能,以及基于哈希的分片和众所期盼的安全 ...
- Hibernate_day02讲义_使用Hibernate完成CRM客户管理中查询所有客户的操作
- Git Step by Step – (2) 本地Repo
前面一篇文章简单介绍了Git,并前在Windows平台上搭建了Git环境,现在就正式的Git使用了. Git基本概念 在开始Git的使用之前,需要先介绍一些概念,通过这些概念对Git有些基本的认识,这 ...
- photoshop制作简单ico图标
新建16 * 16透明画布 字体20px 半径4px
- windows防火墙设置端口开放技巧
选择“打开或者关闭windows防火墙”把防火墙打开,然后选择“高级设置”,选择“创建规则”来指定端口.(这里也可以在“入站规则”里选择已经存在的端口.) 指定ip开放3389端口 某新服务器,开放8 ...
- RF-For循环使用
场景1: