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~


相关文章
|
4月前
|
Prometheus Kubernetes 负载均衡
Opentelemetry collector用法
本文详细介绍了Opentelemetry Collector的使用方法及其各个组件(receiver、processor、exporter、connector和服务配置)的功能与配置。Collector的核心组件通过官方仓库提供丰富的实现,涵盖了认证、健康监控等功能。
134 6
Opentelemetry collector用法
热部署instrumentation工具类
利用jvm的instrumentation类实现实时修改class文件,用来更新线上代码。
|
Java Android开发 C++
[Android JNI] --- 静态注册和动态注册实现java和native相互调用
[Android JNI] --- 静态注册和动态注册实现java和native相互调用
166 0
|
监控 Java API
APM - Javassist 入门 生成一个简单类
APM - Javassist 入门 生成一个简单类
135 0
|
Arthas 自然语言处理 监控
Java Agent入门实战(一)-Instrumentation介绍与使用
Instrumentation: 在计算机科学技术中的英文释义是插桩、植入。 instrument: 仪器(仪器是指用以检出、测量、观察、计算各物理量、物质成分、物性参数等的器具或设备。)
708 0
Java Agent入门实战(一)-Instrumentation介绍与使用
Android | 依赖注入与 Dagger2 框架【@Deprecated】
Android | 依赖注入与 Dagger2 框架【@Deprecated】
220 0
Android | 依赖注入与 Dagger2 框架【@Deprecated】
|
监控 Java API
Java的Instrumentation类原理分析(下)
Java的Instrumentation类原理分析(下)
181 0
|
监控 Java API
Java的Instrumentation类原理分析(上)
Java的Instrumentation类原理分析(上)
417 0
|
存储 Java API
OpenTracing的使用实例(Java)
## 构件组织 OpenTracing API的Java构件如下: * opentracing-api:主要的API,无其他依赖。 * opentracing-noop:为主要API提供无意义实现(NoopTracer),依赖于opentracing-api。 * opentracing-util:工具类,例如GlobalTracer和默认的基于ThreadLocal存储的Scop
7340 0

热门文章

最新文章