javaagent入门指南

第一次见到javaagent时,是偶然了解到Spring的AOP中使用了一个Instrumentation技术,对自己来说是一个新的知识点,所以很好奇,因此查阅相关文档和资料进行学习,在此记录,如有不妥之处,请指正。

运行环境:

  • 操作系统:Windows10
  • jdk版本:openjdk version 11.0.7

概述

javaagent顾名思义就是一个java代理,我们知道任何一项java应用的启动都需要有一个入口函数,加载从入口函数开始一直扩散到整个应用。类在jvm中的加载顺序是:加载——>验证——>准备——>解析——>初始化。在加载阶段,jvm需要读入类的二进制信息,如果我们有一项技术,可以在验证阶段开始前对类的二进制信息进行操作,岂不是美滋滋?此时就需要用到java代理,从外部视角可以将它看做一个java程序的代理,可以通过它在类加载过程中对类信息进行合法操作。

当我们在启动应用程序时,可以使用-javaagent选项指定对应的javaagent:

-javaagent:<jar 路径>[=<选项>]
                  加载 Java 编程语言代理, 请参阅 java.lang.instrument

实际上instrument模块是在java.instrument下,不知道为什么它显示的不对:1592704787342

对于javaagent类,它的主函数前置启动方法(即main函数开始前的方法)的方法签名有特定的要求,必须要满足以下两种格式:

public static void premain(String agentArgs)
public static void premain(String agentArgs, Instrumentation inst)

注意:文章的主函数前置启动方法主函数后置启方法都是我自己为了便于称呼起的。

jvm会优先加载第一种,如果第一种没有则加载第二种方法,反之则忽略:1592704979168

Instrumentation接口的方法如下:

public interface Instrumentation {
   
    /**
     * 注册一个Class文件转换器,转换器可以观测到除转换器所用到的Class外的所有Class的定义。
     * 转换器的顺序由ClassFileTransformer传入顺序决定,当转换器出现异常时,也会按照顺序
     * 调用下一个转换器。
     * 参数 canRetransform 设置是否允许重新转换。
     */
    void addTransformer(ClassFileTransformer transformer, boolean canRetransform);

    /**
     * Registers the supplied transformer.
     * <P>
     * Same as <code>addTransformer(transformer, false)</code>.
     *
     * @param transformer          the transformer to register
     * @throws java.lang.NullPointerException if passed a <code>null</code> transformer
     * @see    #addTransformer(ClassFileTransformer,boolean)
     */
    void addTransformer(ClassFileTransformer transformer);

    /**
     * 删除一个Class转换器
     */
    boolean removeTransformer(ClassFileTransformer transformer);

    /**
     * 判断JVM配置是否支持转换这个类
     */
    boolean isRetransformClassesSupported();

    /**
     * 在类加载之后,重新定义该Class
     */
    void retransformClasses(Class<?>... classes) throws UnmodifiableClassException;

   /**
    * 判断JVM配置是否支持重新定义这个类
    */
    boolean isRedefineClassesSupported();

    /**
     * 使用提供的类文件重新定义提供的类集
   
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值