• 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) 方法。


  • 相关阅读:
    Java 如何有效地避免OOM:善于利用软引用和弱引用
    LRU缓存实现(Java)
    Java实现LRU(最近最少使用)缓存
    HashSet,TreeSet和LinkedHashSet的区别
    IIS-详解IIS中URL重写工具的规则条件(Rule conditions)
    IIS-代理
    IIS-新建网站
    IIS-反向代理配置&&插件安装
    IIS-C#项目环境搭建
    IIS-Windows10如何安装
  • 原文地址:https://www.cnblogs.com/beautiful-code/p/6442841.html
Copyright © 2020-2023  润新知