Instrumentation 介绍与使用

简介: Instrumentation 介绍与使用

使用 Insrumentation ,开发者而言构建一个独立于应用程序的代理程序(Agent),监测和协助运行在JVM 上的程序,甚至可以替换和修改某些类的定义。简单的来说 开发者使用Instrumentation 可以实现一种虚拟机级别的AOP实现。

Instrumentation 的最大作用,就是类定义动态改变和操作。程序运行时,通过 -javaagent 参数指定一个特定的 jar 文件来启动  Instrumentation 的代理程序。其实这个对很多人来说不陌生 xmind, idea 永久破解的过程中,都有使用  -javaaegent ,然后指定一个 jar 文件。甚至一些监控软件也用了,例如 skywalking。


看看怎么用


java.lang.instrument 包的具体实现。


代理类


import java.lang.instrument.Instrumentation;
public class Agent {
    /**
     * 编写一个 Java 类 包含
     * public static void premain(String agentArgs, Instrumentation inst);  [1]
     * public static void premain(String agentArgs); [2]
     * @param options
     * @param ins
     */
    public static void premain(String options, Instrumentation ins) {
        if (options != null) {
            System.out.printf("  I've been called with options: \"%s\"\n", options);
        }
        else {
            System.out.println("  I've been called with no options.");
        }
        ins.addTransformer(new Transformer());
    }
}



transformer 类


import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;
import java.util.Date;
public class Transformer implements ClassFileTransformer {
    @Override
    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
        if ("com/wangxiaoming/instrument/Dog".equals(className)) {
            System.out.println("Dog's method invoke at\t" + new Date());
        }
        return null;
    }
}


怎么能够打成jar包?

首先在classpath 下增加一个 resources\META-INF\MANIFEST.MF 文件


Manifest-Version: 1.0
Premain-Class: com.wangxiaoming.instrument.Agent
Can-Redefine-Classes: true


关键在 Permain-Class :对应的类路径得和真实的一致。

其次是 maven pom.xml 中

<build>
        <finalName>agent</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.3.1</version>
                <configuration>
                    <archive>
                        <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.18.1</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <outputDirectory>${basedir}</outputDirectory>
                    <archive>
                        <index>true</index>
                        <manifest>
                            <addClasspath>true</addClasspath>
                        </manifest>
                        <manifestEntries>
                            <Premain-Class>com.wangxiaoming.instrument.Agent</Premain-Class>
                        </manifestEntries>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>



然后 mvn install 即可 生成 一个 agent.jar

测试一下


public class InstrumentTest {
    public static void main(String[] args) {
        System.out.println(new Dog().hello());
    }
}


public class Dog {
    public String hello() {
        return "wow wow~";
    }
}


java -javaagent:jar 文件的位置 [= 传入 premain 的参数 ]


640.jpg


运行结果


I've been called with options: "hello"
Dog's method invoke at    Sun Sep 22 23:01:52 CST 2019
wow wow~


相关文章
|
3月前
|
机器学习/深度学习 存储 缓存
DNS解析中TTL参数深度解析
本文深度解析DNS解析中的TTL参数,涵盖技术规范、优化策略及工程实践。内容包括TTL定义、分层缓存机制、企业配置建议、变更管理流程、特殊场景应对方案及前沿技术演进,助你全面掌握TTL优化方法。
447 1
|
2月前
|
传感器 开发工具 开发者
最全DIY嵌入式智能手表 | STM32可编程多功能手表 [开源分享]
随着技术的不断进步和用户需求的不断变化,这款STM32可编程多功能手表有着广阔的发展潜力。未来,我们可以加入更多的传感器模块,如心率传感器、温湿度传感器等,进一步扩展手表的功能,提升其在健康监测、运动跟踪等领域的应用。同时,通过开源平台的支持,开发者可以贡献自己的创意和代码,推动手表功能的持续创新与优化。
最全DIY嵌入式智能手表 | STM32可编程多功能手表 [开源分享]
|
7月前
|
人工智能 Java 数据库
飞算 JavaAI:革新电商订单系统 Spring Boot 微服务开发
在电商订单系统开发中,传统方式耗时约30天,需应对复杂代码、调试与测试。飞算JavaAI作为一款AI代码生成工具,专注于简化Spring Boot微服务开发。它能根据业务需求自动生成RESTful API、数据库交互及事务管理代码,将开发时间缩短至1小时,效率提升80%。通过减少样板代码编写,提供规范且准确的代码,飞算JavaAI显著降低了开发成本,为软件开发带来革新动力。
|
存储 缓存 数据库
缓存技术有哪些应用场景呢
【10月更文挑战第19天】缓存技术有哪些应用场景呢
|
XML Java 开发者
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
255 0
|
存储 Java Android开发
Android系统 设置第三方应用为默认Launcher实现和原理分析
Android系统 设置第三方应用为默认Launcher实现和原理分析
2109 0
|
传感器 编译器 C语言
什么时候用C而不用C++?
虽然C++在很多方面提供了强大的特性和灵活性,但在特定的应用场景下,C语言的简单性、直接性和高效性使其成为更好的选择。通过了解不同场景下的需求和特性,开发者可以更明智地选择合适的编程语言,以达到最佳的开发效果和性能。希望本文能帮助你在选择使用C和C++时做出更好的决策。
248 2
|
11月前
|
算法 编译器 C语言
【C语言】C++ 和 C 的优缺点是什么?
C 和 C++ 是两种强大的编程语言,各有其优缺点。C 语言以其高效性、底层控制和简洁性广泛应用于系统编程和嵌入式系统。C++ 在 C 语言的基础上引入了面向对象编程、模板编程和丰富的标准库,使其适合开发大型、复杂的软件系统。 在选择使用 C 还是 C++ 时,开发者需要根据项目的需求、语言的特性以及团队的技术栈来做出决策。无论是 C 语言还是 C++,了解其优缺点和适用场景能够帮助开发者在实际开发中做出更明智的选择,从而更好地应对挑战,实现项目目标。
417 0
|
关系型数据库 MySQL 数据库
MySQL 启动日志报错: File /mysql-bin.index not found (Errcode: 13 - Permission denied)
MySQL 启动日志报错: File /mysql-bin.index not found (Errcode: 13 - Permission denied)
1012 2
|
编解码 测试技术 Android开发
Appium Inspector与Weditor:移动端测试的利器
本文介绍了两款移动端自动化测试的元素定位工具:Appium Inspector和weditor。Appium Inspector是官方推荐的辅助工具,而weditor是基于Python的ATX生态工具,支持Android和iOS界面分析。weditor安装需Python 3.6以上版本,可能遇到的GBK编码问题可通过更改系统区域设置解决。它提供设备界面、元素详情和代码运行三个主要部分,便于元素定位、属性查看及交互代码执行。这两款工具对于提升开发和测试效率具有积极作用。