关于java.lang.instrument包的学习

  1. Java SE6文档中是这样介绍这个包的:提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务.目前学习看来该包是用于在JVM级别实现AOP的操作。
  2. 接口主要分为ClassFileTransformer和Instrumentation,
    (1)对于Instrumentation,该类提供了检测Java编程语言代码所需的服务。addTransformer(ClassFileTransformer transformer)方法将自定义的实现ClassFileTransformer接口的类加入到AOP机制中。接口ClassFileTransformer中定义了transform方法,返回值是byte[]数组,实现类干的活实际上是将目标类文件转换成字节码数组。
    redefineClasses(ClassDefinition… definitions)也可以实现类之间的转换,传参是一个ClassDefinition集合,ClassDefinition类包含属性mClass(待转换的类Class)和mClassFile(转换后的类的字节码数组)
    两种方法在premain中实现代码:

(一)

public class Premain {
    public static void premain(String agentArgs,Instrumentation inst)
            throws ClassNotFoundException,UnmodifiableClassException{
        ClassDefinition def = new ClassDefinition(ClassFileTransformerImpl.class,ClassFileTransformerImpl
                .getBytesFromFile(ClassFileTransformerImpl.DESTCLASS));
        inst.redefineClasses(new ClassDefinition[] { def });
        System.out.println("success");

    }

}

(二)

public class Premain {
    public static void premain(String agentArgs,Instrumentation inst)
            throws ClassNotFoundException,UnmodifiableClassException{
        inst.addTransformer(new ClassFileTransformerImpl());

    }

}

(2)接口ClassFileTransformer源码

public interface ClassFileTransformer {
	byte[] transform(  ClassLoader         loader,
                String              className,
                Class<?>            classBeingRedefined,
                ProtectionDomain    protectionDomain,
                byte[]              classfileBuffer)
        throws IllegalClassFormatException;
}

3:实现AOP可以在主程序main函数之前或之后执行,分别是Premain-Class的premain 方法,Agent-Class的agentmain 方法,这两者都要去jar包中META-INF文件夹下的MANIFEST.MF文件中配置下。

Manifest-Version: 1.0
Implementation-Title: springboot-002
Implementation-Version: 0.0.1-SNAPSHOT
Start-Class: com.kane.springboot002.Springboot002Application
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.1.5.RELEASE
Created-By: Maven Archiver 3.4.0
Main-Class: org.springframework.boot.loader.JarLauncher
Agent-Class: com.kane.springboot002.proxy.AgentMain
Premain-Class: com.kane.springboot002.proxy.Premain

4:特殊的jar包启动方式;
java -javaagent:jar 文件的位置 [= 传入 premain 的参数 ]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值