文章目录
- 前言
- 一、Instrumentation类
-
- 1.addTransformer(ClassFileTransformer transformer, boolean canRetransform)
- 2.addTransformer(ClassFileTransformer transformer)
- 3.removeTransformer(ClassFileTransformer transformer)
- 4.isRetransformClassesSupported()
- 5.retransformClasses(Class… classes) throws UnmodifiableClassException
- 6.isRedefineClassesSupported()
- 7.redefineClasses(ClassDefinition… definitions) throws ClassNotFoundException, UnmodifiableClassException
- 8.isModifiableClass(Class theClass)
- 9.getAllLoadedClasses()
- 10.getInitiatedClasses(ClassLoader loader)
- 11.getObjectSize(Object objectToSize)
- 12.appendToBootstrapClassLoaderSearch(JarFile jarfile)
- 13.appendToSystemClassLoaderSearch(JarFile jarfile)
- 14.isNativeMethodPrefixSupported()
- 15.setNativeMethodPrefix(ClassFileTransformer transformer, String prefix)
- 二、ClassFileTransformer类
- 总结
前言
Instrumentation主要是提供Java代码增强功能。例如为了提供收集数据的功能,可以通过字节码增强技术,对类的方法进行增强。由于代码是添加的,所以他不会修改原来的状态。通过这个API,我们可以开发各种工具,例如监控的客户端,profiles,代码覆盖率分析工具以及事件的日志埋点工具。
使用方式:
一是在java启动的时候添加启动参数javaagent将你的增强包加载进来,会在permain里把Instrumentation传过来
二是使用VirtualMachine的API来进行。
具体的做法是调用VirtualMachine.attach(java pid),会在agentmain方法里把Instrumentation实例传过来
提示:以下是本篇文章介绍其中的方法
一、Instrumentation类
1.addTransformer(ClassFileTransformer transformer, boolean canRetransform)
代码如下(示例):
addTransformer(ClassFileTransformer transformer, boolean canRetransform)
函数的作用是注册一段代码增强逻辑,它能对所有已定义的类生效(除了通过依赖的transformer进行定义的类)。
当一个类被加载的时候,或者是redefineClasses方法被调用的时候,或者是retransformClasses方法被调用的时候(前提是canRetransform的参数是true),这个函数里注册的transformer就被调用了。
至于transformer之间调用的顺序,则是由添加的先后顺序来决定的(假设有多个agent对同一个类的方法进行了增强,他们是按照先后顺序来执行的)可以想象一下管道命令,是一样的。
异常问题,值得注意的是,如果这个方法在执行的时候发生了异常,jvm不会中断,他会继续进行下一个transformer的执行。
重复add的问题,同一个transformer可能会被add多次,这个是不被推荐的,add多次最好new新的对象进行。
当传入的transformer是null的时候,这个方法会抛出NullPointException的异常,当canRetransform被设为true,而JVM虚拟机被设置为不可被reTransfrom的时候(参见isRetransformClassesSupported方法),会抛出UnsupportedOperationException异常。
2.addTransformer(ClassFileTransformer transformer)
代码如下(示例):
addTransformer(ClassFileTransformer transformer)
等同于addTranformer(transformer,false);
3.removeTransformer(ClassFileTransformer transformer)
代码如下(示例):
removeTransformer(ClassFileTransformer transformer)