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

Если я использую jvmti_env->GetClassFields(objClass, &numOfFields, &fieldIds);, мне все равно нужно решить, вызывать ли GetStatic Field или Get Field.Как мне определить, какой использовать?Я знаю, что в 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 Ответ

1 голос
/ 10 января 2012

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

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

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

jint accessFlags
...
(*jvmti)->GetFieldModifiers(jvmti, objClass, fieldIds[i], &accessFlags);
if (accessFlags & 0x0008)
   printf("STATIC\n");
else
   printf("NOT STATIC\n");
...