使用 JNI / JVMTI - 如何确定 jfieldID 是否是静态的

发布于 2024-12-25 03:57:33 字数 558 浏览 2 评论 0原文

如果我使用 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 的解决方案。
谢谢!

If I use jvmti_env->GetClassFields(objClass, &numOfFields, &fieldIds); I still have to decide whether to call GetStatic<Type>Field or Get<Type>Field.
How do I determine which one to use? I know that in java.lang.reflect.Field I can query fields' modifiers for static.

I've found a workaround here:
http://zoo.cs.yale.edu/classes/cs433/programming/examples-java-socket/jdk1.5/hotspot/src/share/vm/runtime/jfieldIDWorkaround.hpp

But I prefer a solution from the JVM.

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

吻泪 2025-01-01 03:57:33

使用功能
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");

Use function
GetFieldModifiers in JVMTI.

Values returned by this function are described here:
http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html#1480

So for static you should check like this:

jint accessFlags
...
(*jvmti)->GetFieldModifiers(jvmti, objClass, fieldIds[i], &accessFlags);
if (accessFlags & 0x0008)
   printf("STATIC\n");
else
   printf("NOT STATIC\n");
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文