当前位置: 首页 > 面试题库 >

JNI,如何列出所有当前实例?

暴乐邦
2023-03-14
问题内容

我想知道是否可以使用JNI api列出当前JVM中的所有当前可用实例(作为jobject)。

我的意思示例:

jvm->AttachCurrentThreadAsDaemon((void**)&env,0);
jobject* instances;
int count = env->GetInstances(&instances);

我的任务是在它们中搜索实现特定interface(env->IsInstanceOf())的对象,我必须动态且全局地执行此操作,而无需类名


问题答案:

JVMTI将提供帮助。

  1. 调用IterateOverInstancesOfClass以标记所有必需的对象;
  2. 调用GetObjectsWithTags将所有标记的对象复制到jobject*数组。

这是一个例子。注意,它targetClass也可以是接口。

static jvmtiIterationControl JNICALL
HeapObjectCallback(jlong class_tag, jlong size, jlong* tag_ptr, void* user_data) {
    *tag_ptr = 1;
    return JVMTI_ITERATION_CONTINUE;
}

JNIEXPORT void JNICALL
Java_Test_iterateInstances(JNIEnv* env, jclass ignored, jclass targetClass) {
    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(targetClass, JVMTI_HEAP_OBJECT_EITHER,
                                       HeapObjectCallback, NULL);

    jlong tag = 1;
    jint count;
    jobject* instances;
    jvmti->GetObjectsWithTags(1, &tag, &count, &instances, NULL);

    printf("Found %d objects with tag\n", count);

    jvmti->Deallocate((unsigned char*)instances);
}


 类似资料:
  • 我知道我可以使用,但如何获取所有当前可用GPU的列表?

  • 问题内容: 我已经看到了很多人从一个模块中提取所有类的示例,通常是这样的: 太棒了 但是我无法找到如何从 当前 模块中获取所有类。 这可能确实很明显,但是我什么也找不到。谁能帮我吗? 问题答案: 尝试这个: 在您的情况下: 甚至更好: 因为带谓语。

  • 我在(裸机)集群中运行kube dns。我知道这是可行的,因为我可以将服务插入到我创建的名称中,并获得主机条目: 我不知道怎么做的是列出kube dns持有的所有记录。我尝试了一些标准的DNS技巧,比如dig和,但都没有成功。但无论如何,库伯内特斯自己一定有办法做到这一点。我试着检查配置地图,但没有找到我要找的东西。

  • 问题内容: 例如,当我想设置在 谢谢。 问题答案: 检查这其他的选择。

  • 问题内容: 我想建立一个基于php的站点,该站点在我的Ubuntu服务器上(自动)执行一些命令 我要做的第一件事是转到文件(sudoers)并添加用户www-data,以便我可以以root权限执行php命令! 然后我的PHP代码是 它仅返回一个用户(最后一个用户)!如何使其返回所有用户? 谢谢 问题答案: 从exec的PHP手册中: 返回值 命令结果的最后一行。如果您需要执行命令并直接将命令中的所