java pre main_JavaAgent学习之旅(一|静态的premainDemo实例)

本文介绍了JavaAgent技术,它允许在JVM启动前或运行时植入探针类,进行特殊操作,如动态修改字节码。通过一个简单的Java项目展示了如何创建JavaAgent,包括探针代码编写、MANIFEST.MF配置和POM.xml设置。最后,通过在运行时添加虚拟机参数启动探针。虽然示例未涉及字节码修改,但提到了结合JavaAssist等工具可以实现此类功能。
摘要由CSDN通过智能技术生成

一:什么是JavaAgent

JavaAgent顾名思义就是Java探针技术,我理解的是,通过一个JavaAgent探针类,可以在java虚拟机启动之前,或者运行的时候植入这个探针类,对jvm做一些特别的操作,如动态改变字节码文件这种,要想植入,肯定是通过jvm参数来搞了

使用JavaAgent的技术的项目我目前知道的是SkyWalking,dubbo用没用我没印象了

二:JavaAgent在JVM运行启动的时候,做一些操作

1.创建一个Java项目,Pure Java Project Only Main method,文件结构如下:

bfe9553cf94b273256f0974aa0f0b6fb.png

AgentDemoDoMain.Java:

package com.shi;

/**

* @author DaTou

* @Description

* @Date 2020/9/21

**/

public class AgentDemoDoMain {

public static void main(String[] args) {

Test test = new Test();

new Thread(()->{

while (true){

try {

Thread.sleep(2000);

} catch (InterruptedException e) {

e.printStackTrace();

}

test.printTest();

}

}).start();

}

}

Test.java:

package com.shi;

/**

* @author DaTou

* @Description

* @Date 2020/9/21

**/

public class AgentDemoDoMain {

public static void main(String[] args) {

Test test = new Test();

new Thread(()->{

while (true){

try {

Thread.sleep(2000);

} catch (InterruptedException e) {

e.printStackTrace();

}

test.printTest();

}

}).start();

}

}

2.创建一个JavaAgent项目,代码结构如下:

611c43b9a0958e2ac89ff1235c34c2a7.png

AgentDemo.java--探针代码:

**其实探针代码是很普通的一个方法,真正需要注意的是MANIFEST.MF文件的配置,项目结构是使用的maven,所以pom的配置对MANIFEST.MF的生成至关重要

package com.shi;

import java.lang.instrument.Instrumentation;

/**

* @author DaTou

* @Description

* @Date 2020/9/21

**/

public class AgentDemo {

/**

* java-agent 静态载入的情况

* @param agentOps

* @param instrumentation

*/

public static void premain(String agentOps, Instrumentation instrumentation) {

System.out.println("====premain method====");

}

}

MANIFEST.MF

Manifest-Version: 1.0

Premain-Class: com.shi.AgentDemo

POM.XML:pom的关键是在对maven打包插件的管理上,要说明自己写的MANIFEST.MF文件的位置,maven打包的时候将会忽略这个文件,生成自己的MANIFEST.MF文件

4.0.0

com.shi

agent-demo

1.0-SNAPSHOT

org.apache.maven.plugins

maven-jar-plugin

src/main/resources/META-INF/MANIFEST.MF

3.运行项目:

运行AgentDemoDoMain.java中的main方法,加入虚拟机参数(xxxx就是探针包的位置):

-javaagent:xxxxx\agent-demo-1.0-SNAPSHOT.jar

4.结束,本次记录的是java探针技术静态插入的demo,没有很复杂,不涉及对类字节码文件的修改,利用java探针结合字节码的一些工具类如javaassit,可以改变编译后的class文件,实现自己想要的功能,但是javaassit我不会,说白了就是运行了两个main方法而已,一个main一个premain

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值