前面几篇文章介绍了JVMTI接口的一些基本概念,以及如何编写一个基于JVMTI的agent。
那些简单的例子只是JVMTI agent自己实现一些简单的功能,如果能够将JVMTI提供的接口经过包装之后提供给Java使用,
能够发挥更大的作用。
需求
本文源自一个实际的需求:业务代码需要在不依赖spring容器的情况下,或者spring的ApplicationContext对象实例,
进而能够获取到spring管理的所有bean。对这个需求再进行通用扩展,可以简化成:传入一个类(或者是类签名,这里有个ClassLoader的坑,后面会提到。),返回该类在堆中的所有实例。
实现
由于JVMTI只提供了C/C++接口,因此要让业务代码能够调用到,必须要通过JNI接口。因此实现需要分成两个部分:Java部分和C++部分。
其中Java部分比较简单,内部会定义一个native方法来最终调用JNI提供的函数。C++部分也可以拆成两部分,一部分基于JVMTI,
用于处理JVMTI规范定义的初始化和JVMTI API调用的实现;另一部分基于JNI,用于最终向Java部分提供实现。
Java API
需求章节事实上已经确认了Java端的API,提供的方法定义很简单,分别是:
class ObjectQueryUtils {
public static List queryObjects(String name) {
...
}
public stati