java - 访问类字段的值

标签 java java-native-interface jvmti

我正在编写 JVMTI 代理程序,并且在我获得 jobject 时尝试访问特定的类字段值。我知道它们位于堆上而不是堆栈上。

不幸的是,看着这个对我没有帮助。

https://docs.oracle.com/javase/7/docs/platform/jvmti/jvmti.html#object

jclass jcls = env->GetObjectClass(object_value);

jint fields_count;
jfieldID *fields;
jvmti->GetClassFields(jcls, &fields_count, &fields);

jfieldID field;
char *field_name;
char *field_sig;
for (int i = 0; i < fields_count; i++) {
    error = jvmti->GetFieldName(jcls, fields[i], &field_name, &field_sig, NULL);
    if (error != JVMTI_ERROR_NONE) {
        printf("GetFieldName error %d\n", error);
    }
    printf("Field %s has sig %s\n", field_name, field_sig);
    if (strcmp("I", field_sig) == 0) {
        int_value = env->GetIntField(object_value, fields[i]); <-- BREAKS
        printf("Value %d\n", int_value);
    }
}

这会中断,因为它是在静态 int 字段上调用的。我怎样才能确定这里的字段是静态的?

最佳答案

您可以使用以下代码获取 Field 修饰符,然后检查 STATIC 修饰符 -

   jint modifiersPtr;
   jvmti->GetFieldModifiers(classPtr, jfieldID, &modifiersPtr);

   if (modifiersPtr & 0x0008) {
        // STATIC 
        jint jIntVal = (jbyte) env->GetStaticIntField(clazz, fieldId);

    } else {
        // NON-STATIC
        jint jIntVal = (jbyte) env->GetIntField(objectValuePtr, fieldId);
    }

关于java - 访问类字段的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42441196/

相关文章:

c - Unresolved inclusion 在 JNI 中的 java header 中

c++ - JNI-C++ 使用 jni 时如何清理 jfloat 等原语

java - JVMTI 类未准备好

java - JVMTI SuspendThread 和 Javas thread.suspend 有什么区别?

windows - 编译Agent没有报错 "not valid Windows image"的信息

java - 从 java 程序中执行 .app 文件

java - 计算文本文件中唯一单词的数量

c - JNI 库中 OS/X 上的指针截断为 'realloc()'

java - Grails 中日期格式的错误输出

java - JavaFx 中的 UI 没有响应