1

如果我使用jvmti_env->GetClassFields(objClass, &numOfFields, &fieldIds);,我仍然需要决定是调用 GetStatic<Type>Field 还是 Get<Type>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 的解决方案。
谢谢!

4

1 回答 1

1

在 JVMTI 中使用函数 GetFieldModifiers 。

此处描述了此函数返回的值: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");
于 2012-01-09T20:34:00.040 回答