Использование JNI / JVMTI - Как определить, является ли jfieldID статическим или нет

Если я использую jvmti_env->GetClassFields(objClass, &numOfFields, &fieldIds); Мне все еще нужно решить, вызывать ли GetStaticField или GetField. Как мне определить, какой использовать? Я знаю, что в java.lang.reflect.Field я могу запросить модификаторы полей для статических.

Я нашел обходной путь здесь: http://zoo.cs.yale.edu/classes/cs433/programming/examples-java-socket/jdk1.5/hotspot/src/share/vm/runtime/jfieldIDWorkaround.hpp
Но я предпочитаю решение от JVM.
Спасибо!

1 ответ

Решение

Используйте функцию GetFieldModifiers в JVMTI.

Значения, возвращаемые этой функцией, описаны здесь: http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html

Так что для статики вы должны проверить вот так:

jint accessFlags
...
(*jvmti)->GetFieldModifiers(jvmti, objClass, fieldIds[i], &accessFlags);
if (accessFlags & 0x0008)
   printf("STATIC\n");
else
   printf("NOT STATIC\n");
Другие вопросы по тегам