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】
点击 M, 执行 mvn clean package
查看jar包中的 MANIFEST.MF文件 , MANIFEST.MF文件用于描述Jar包的信息,例如指定入口函数等。
【引入agent jar 为当前应用启动前插入premain逻辑】
jvm参数指定
-javaagent:E:\IdeaProjects\javaagent\target\javaagent-1.0-SNAPSHOT.jar
执行,观察我们引入的这个jar包中的premain方法是否优先于这个测试类的main方法执行
OK ,这个就是Java Agent的 简单小栗子, 更强大的功能继续开篇
既然是搞字节码,有没有类库啊 ?
Javassist 引入
Javassist是一个开源的分析、编辑和创建Java字节码的类库。
关于java字节码的处理, 目前有很多开源工具可用,比如asm,bcel, 不过这些都需要直接跟虚拟机指令打交道,实在是太难。。。。。
如果不想了解虚拟机指令,可以采用javassist。
javassist是jboss的一个子项目,优点简单 快速 ,直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类。
本文地址:https://blog.csdn.net/yangshangwei/article/details/107379611
上一篇: oracle中add_months()函数及用法总结
下一篇: CSS实现等分布局的4种方式
推荐阅读
-
Java常见问题之javac Hello.java找不到文件的解决方法
-
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
-
IntelliJ IDEA 创建spring boot 的Hello World 项目(图解)
-
Surface Book/Pro 4电池耗电很快怎么办? 关闭Windows Hello
-
html5 canvas-1.canvas介绍(hello canvas)
-
最快速的Android开发环境搭建ADT-Bundle及Hello World
-
typecho插件编写教程(一):Hello World
-
Kotlin开发实战之hello world
-
Android Kotlin开发实例(Hello World!)及语法详解
-
Visual studio怎么编写HELLO WORLD程序?