欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

APM - Hello Javaagent

程序员文章站 2022-03-27 12:36:52
文章目录什么是javaagent什么是javaagent简单来说, javaagent 是在class 被装在到ClassLoader之前对其拦截,插入自定义的监听字节码,可实现零侵入的监控,是APM的核心技术Java1.5之后引入的特性...


APM - Hello  Javaagent

什么是javaagent

简单来说, javaagent 是在class 被装在到ClassLoader之前对其拦截,插入自定义的监听字节码,可实现零侵入的监控,是APM的核心技术

Java1.5之后引入的特性

JavaAgent 运行在 main方法之前 ,内置的方法名为premain,即先执行premain方法,然后再执行main方法。通过premain方法,可实现一个JavaAgent。


从零搭建第一个javaagent

maven搭建 编译

【pom.xml】

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.artisan</groupId>
    <artifactId>javaagent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <archive>
                        <manifestEntries>
                            <Project-name>${project.name}</Project-name>
                            <Project-version>${project.version}</Project-version>
                            <Premain-Class>com.artisan.ssist.JavaAgentDemo</Premain-Class>
                            <Boot-Class-Path>javassist-3.18.1-GA.jar</Boot-Class-Path>
                            <Can-Redefine-Classes>false</Can-Redefine-Classes>
                        </manifestEntries>
                    </archive>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.18.1-GA</version>
        </dependency>
    </dependencies>

</project>
  • Premain-Class:指定包含 premain 方法的类名 ,改成自己的类
  • Can-Redefine-Class:是否能重新定义此代理所需的类,默认为 false。

【Agent Code】

package com.artisan.ssist;

import java.lang.instrument.Instrumentation;

public class JavaAgentDemo {

    public  static void premain(String args ,Instrumentation instrumentation){
        System.out.println("premain  first agent demo");
    }
}


【编译成jar】

APM - Hello  Javaagent

点击 M, 执行 mvn clean package

APM - Hello  Javaagent

查看jar包中的 MANIFEST.MF文件 , MANIFEST.MF文件用于描述Jar包的信息,例如指定入口函数等。

APM - Hello  Javaagent


【引入agent jar 为当前应用启动前插入premain逻辑】

jvm参数指定

-javaagent:E:\IdeaProjects\javaagent\target\javaagent-1.0-SNAPSHOT.jar

APM - Hello  Javaagent

执行,观察我们引入的这个jar包中的premain方法是否优先于这个测试类的main方法执行

APM - Hello  Javaagent

OK ,这个就是Java Agent的 简单小栗子, 更强大的功能继续开篇

既然是搞字节码,有没有类库啊 ?


Javassist 引入

Javassist是一个开源的分析、编辑和创建Java字节码的类库。

关于java字节码的处理, 目前有很多开源工具可用,比如asm,bcel, 不过这些都需要直接跟虚拟机指令打交道,实在是太难。。。。。

如果不想了解虚拟机指令,可以采用javassist。

javassist是jboss的一个子项目,优点简单 快速 ,直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类。

本文地址:https://blog.csdn.net/yangshangwei/article/details/107379611