JavaAgent的简单例子

 更新时间:2021年04月22日 09:36:34   作者:catoop  
这篇文章主要介绍了JavaAgent的简单例子,对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
     * @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

特别提醒:如果你把 -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的资料请关注脚本之家其它相关文章!

相关文章

  • Java 高并发十: JDK8对并发的新支持详解

    Java 高并发十: JDK8对并发的新支持详解

    本文主要介绍Java 高并发JDK8的支持,这里整理了详细的资料及1. LongAdder 2. CompletableFuture 3. StampedLock的介绍,有兴趣的小伙伴可以参考下
    2016-09-09
  • Spring实现数据库读写分离详解

    Spring实现数据库读写分离详解

    这篇文章主要介绍了Spring 实现数据库读写分离,大多数系统都是读多写少,为了降低数据库的压力,可以对主库创建多个从库,从库自动从主库同步数据,程序中将写的操作发送到主库,将读的操作发送到从库去执行,需要的朋友可以参考下
    2024-01-01
  • MyBatis逆向工程生成dao层增删改查的操作

    MyBatis逆向工程生成dao层增删改查的操作

    这篇文章主要介绍了MyBatis逆向工程生成dao层增删改查的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java中动态规则的实现方式示例详解

    Java中动态规则的实现方式示例详解

    这篇文章主要介绍了Java中动态规则的实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java在web页面上的编码解码处理及中文URL乱码解决

    Java在web页面上的编码解码处理及中文URL乱码解决

    这篇文章主要介绍了Java在web页面上的编码解码处理及中文URL乱码解决,文中所介绍的两种使用过滤器解决中文链接乱码的方法非常有效,需要的朋友可以参考下
    2016-02-02
  • Java 递归查询部门树形结构数据的实践

    Java 递归查询部门树形结构数据的实践

    本文主要介绍了Java 递归查询部门树形结构数据的实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 一文详解Java项目中如何优雅的使用枚举类型

    一文详解Java项目中如何优雅的使用枚举类型

    枚举类型在开发中是很常见的,有非常多的应用场景,这篇文章我们就来学习一下项目中如何优雅的使用枚举类型,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • springboot 2.0 mybatis mapper-locations扫描多个路径的实现

    springboot 2.0 mybatis mapper-locations扫描多个路径的实现

    这篇文章主要介绍了springboot 2.0 mybatis mapper-locations扫描多个路径的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 基于javassist进行动态编程过程解析

    基于javassist进行动态编程过程解析

    这篇文章主要介绍了基于javassist进行动态编程过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java数据结构常见几大排序梳理

    Java数据结构常见几大排序梳理

    Java常见的排序算法有:直接插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序等。本文详解介绍它们的实现以及图解,需要的可以参考一下
    2022-03-03

最新评论