如何获取一个Java类的对象实例呢?这个类即不一定是单例,也不一定提供静态方法,也不一定由Spring管理,甚至还不能修改其源码的情况下,我们该怎么获取这个类的所有对象实例呢?这里介绍一种基于JVMTI的实现方法。
使用说明
首先引用maven依赖
io.github.liubsyy
FindInstancesOfClass
1.0.1
然后直接调用函数InstancesOfClass.getInstances(Class> targetClass)即可获取一个类的所有对象实例
public class InstancesOfClass {
/**
* native方法 : 返回所有的实例对象
* @param targetClass 需要查询实例的Class
* @return
*/
public static native Object[] getInstances(Class> targetClass);
}
实现原理
Java里面是没有根据类获取实例的接口的,需要用到JVMTI的接口 IterateOverInstancesOfClass和GetObjectsWithTags
首先写一个包含native方法的类
public class InstancesOfClass {
/**
* native方法 : 返回所有的实例对象
* @param targetClass 需要查询实例的Class
* @return
*/
public static native Object[] getInstances(Class> targetClass);
}
再用javah生成.h文件,然后用C++写实现部分
#include
#include
#include "com_liubs_findinstances_jvmti_InstancesOfClass.h"
static jvmtiIterationControl JNICALL objectInstanceCallback(jlong class_tag, jlong size, jlong* tag_ptr, void* user_data) {
*tag_ptr = 1;
return JVMTI_ITERATION_CONTINUE;
}
JNIEXPORT jobjectArray JNICALL Java_com_liubs_findinstances_jvmti_InstancesOfClass_getInstances(JNIEnv* env, jclass clazz, jclass targetClazz) {
JavaVM* vm;
env->GetJavaVM(&vm);
jvmtiEnv* jvmti;
vm->GetEnv((void**)&jvmti, JVMTI_VERSION_1_0);
jvmtiCapabilities capabilities = {0};
capabilities.can_tag_objects = 1;
jvmti->AddCapabilities(&capabilities);
服务器托管网 jvmti->IterateOverInstancesOfClass(targetClazz, JVMTI_HEAP_OBJECT_EITHER,
objectInstanceCallback, NULL);
jlong tag = 1;
jint count;
jobject* instances;
jvmti->GetObjectsWithTags(1, &tag, &count, &instances, NULL);
printf("Found %d objects with tagn", count);
// 转换jobject* 为 jobjectArray 并返回
jobjectArray result = env->NewObjectArray(count, targetClazz, NULL);
服务器托管网 for (int i = 0; i SetObjectArrayElement(result, i, instances[i]);
}
jvmti->Deallocate((unsigned char*)instances);
return result;
}
然后用gcc/g++编译cpp源码,生成linux/mac/windows下对应的动态链接库文件 .so, .dylib和.dll,通过System.load()加载对应本地链接库,最后调用InstancesOfClass.getInstances(Class> targetClass)方法即可。
具体源码详见https://github.com/Liubsyy/FindInstancesOfClass,里面包含了测试用例
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: 基于阿里云 Serverless 容器服务轻松部署企业级 AI 应用
作者:元毅、坤仑 数禾科技 AI 模型服务基于云原生架构,为不同业务环节提供智能决策支持。随着业务的快速发展,摆在数禾面前的难题是支撑模型计算的底层应用资源无法根据请求量来调整机器资源支持运算能力。同时,随着模型在线推理服务数量的增加,数禾的模型服务也变得越来…