[Java]Instrumentation
来源:互联网 发布:ubuntu光盘安装教程 编辑:程序博客网 时间:2024/05/20 17:40
概述
使用方法
在JDK 1.5 中只能用premain的方式在main函数之前执行,我们需要编写一个含有下面方法的Java类:
public static void premain (String agentArgs, Instrumentation inst); public static void premain (String agentArgs);下面来看一个Hello World的例子,首先编写代理代码如下:
package agent;import java.lang.instrument.Instrumentation;public class MyAgent { public static void premain(String agentArgs, Instrumentation inst) { System.out.println("hello world."); }}
在使用的时候需要将其打成jar包,创建一个manifest文件,指定代理类的位置:
Manifest-Version: 1.0Premain-Class: agent.MyAgent然后打成jar包:
jar cvfm agent.jar manifest.MF agent/
接下来开始使用他来做一点事情:
java -javaagent:agent.jar Test------ output ------hello world.Test
----------------------------------------华丽的分割线----------------------------------------
用premain的方式有的非常大的局限:Instrumentation只能在main函数之前执行。在JDK 1.6中加入了另外一个方法:agentmain方法。通过它我们可以在main函数开始执行以后再启动自己的Instrumentation程序,在Java类中需要实现:
public static void agentmain (String agentArgs, Instrumentation inst);public static void agentmain (String agentArgs);
此时需要修改manifest文件:
Agent-Class: agent.MyAgent
首先起来一个JVM循环执行程序,然后编写attach的代码来使用agent.jar:
public static void main(String[] args) throws Exception { new Thread() { public void run() { for (;;) { try { VirtualMachine vm = null; List<VirtualMachineDescriptor> list = VirtualMachine.list(); for (VirtualMachineDescriptor vmd : list) { vm = VirtualMachine.attach(vmd); vm.loadAgent("D:/workspace/wszt/src/agent.jar"); vm.detach(); } } catch (Exception e) { } } } }.start(); Thread.sleep(10000); }
这里需要用到jdk/lib/tools.jar,需要将它加入到classpath。运行之后就可以在控制台中输出"Hello World"。现在我们可以在Java应用中来使用agentMain方法做一些事情了。
----------------------------------------华丽的分割线----------------------------------------
另外有比如对本地方法的agent以及对BootClassPath/SystemClassPath的动态增补,在这里可以看到。
Instrumentation
核心的功能在ClassFileTransformer中实现:
public interface ClassFileTransformer { byte[] transform(ClassLoader loader,String className,Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[]classfileBuffer) throws IllegalClassFormatException;}
通过transform来实现对类的行为的改造,而在Instrumentation中提供的是对ClassFileTransformer的管理与使用。
----------END----------
- Instrumentation.java
- [Java]Instrumentation
- Java Instrumentation
- JAVA Instrumentation
- JAVA Instrumentation 简介
- JAVA Instrumentation简介
- Java Instrumentation技术实践
- <instrumentation>
- Instrumentation
- Instrumentation
- instrumentation
- Instrumentation
- instrumentation
- Instrumentation
- Java SE 6 Instrumentation 功能
- Java 5 特性 Instrumentation 实践
- Java 5 特性 Instrumentation 实践
- Java SE 6 新特性: Instrumentation 新功能
- String系列源码解析01 - 总体框架
- ORACLE in与exists语句的区别
- 程序员高手的软实力
- quartz2.2.1 example 03代码分析
- 深入讲解MySQL授权表
- [Java]Instrumentation
- Web服务器管理系列:11、注意默认的隐含共享
- 二叉查找树
- hdu 1081 & poj 1050 To The Max(最大和的子矩阵)
- 我的第一篇博客
- UIImagePickerController获取图片名
- cocos2dx 3.0 js继承:John Resiq的继承写法解析
- 『ANDROID』Android学习与记录
- java实现简单的动态代理