zoukankan      html  css  js  c++  java
  • java agent 详细介绍 -javaagent参数

    java agent 详细介绍

    简介

    java agent是java命令的一个参数。参数 javaagent 可以用于指定一个 jar 包,并且对该 java 包有2个要求:

    1. 这个 jar 包的MANIFEST.MF 文件必须指定 Premain-Class 项。
    2. Premain-Class 指定的那个类必须实现 premain()方法。

    重点就在 premain 方法,也就是我们今天的标题。从字面上理解,就是运行在 main 函数之前的的类。当Java 虚拟机启动时,在执行 main 函数之前,JVM 会先运行 -javaagent 所指定 jar 包内 Premain-Class 这个类的 premain 方法,其中,该方法可以签名如下:

    1.public static void premain(String agentArgs, Instrumentation inst)
    2.public static void premain(String agentArgs)

    JVM 会优先加载 1 签名的方法,加载成功忽略 2,如果1 没有,加载 2 方法。这个逻辑在sun.instrument.InstrumentationImpl 类中:

    clipboard.png

    如何使用

    1 首先定义一个 MANIFEST.MF 文件:

    Manifest-Version: 1.0
    Can-Redefine-Classes: true
    Can-Retransform-Classes: true
    Premain-Class: cn.think.in.java.clazz.loader.asm.agent.PreMainTraceAgent
    

    创建一个Premain-Class 指定的类,类中包含 premain 方法:

    public class Main {
    
        public static void premain(String agentArgs, Instrumentation inst) {
            System.out.println("agentArgs : " + agentArgs);
            inst.addTransformer(new ClassFileTransformer() {
                @Override
                public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
                                        ProtectionDomain protectionDomain, byte[] classfileBuffer)
                        throws IllegalClassFormatException {
                    System.out.println("premain load Class     :" + className);
                    return classfileBuffer;
                }
            }, true);
        }
    }
    

    将 premain 的类和 MANIFEST.MF 文件打成 jar 包 .
    使用 IDEA 的 build ,当然你也可以使用 maven
    再简单创建一个test类
    public class AccountMain {

    public static void main(String[] args)
            throws ClassNotFoundException, InterruptedException, IllegalAccessException, InstantiationException, NoSuchMethodException,
                   InvocationTargetException {
        System.out.println("11111111111");
    }

    }
    使用参数 -javaagent:jar包名 启动要代理的方法。

    clipboard.png

    和类加载器比较

    类加载器也可以实现运行时修改代码。但是对代码的侵入性很高。使用 java agent 能让修改字节码这个动作化于无形,对业务透明,减少侵入性。

    agent的缺点

    需要设置参数javaagent

  • 相关阅读:
    地理大发现
    克里斯托弗·哥伦布
    2016. last day in office
    泰斯花粉阻隔剂 怎么使用
    ZT 螨虫知识2
    ZT 螨虫的话就不要跟狗多接触,狗的寄生虫很多,还有草地,
    expense KK [ɪkˋspɛns] DJ [iksˋpens]
    Windows 实战项目 001 文件扫描器 (01)
    017 系统内存信息 内存大小 空闲内存 5
    017 虚拟内存页面区块 4
  • 原文地址:https://www.cnblogs.com/hfultrastrong/p/11934573.html
Copyright © 2011-2022 走看看