なく、動的かつグローバルこれをしなければなりません
JVMTIが役に立ちます。
IterateOverInstancesOfClass
を呼び出すと、必要なすべてのオブジェクトにタグを付けることができます。
- アレイにすべてのタグ付きオブジェクトをコピーするには、
GetObjectsWithTags
を呼び出します。
これは例です。 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);
}
「Javaで特定のクラスのすべてのオブジェクトインスタンスを取得する簡単な方法はありますか」(http://stackoverflow.com/questions/1947122/)を参照してください。 –
この質問にも同様のタイトルがありますが、参照される質問は1)古くなっている、2)JNIに関するものではない、3)正確な回答がないため、重複とは限りません。 – apangin