访问班级字段以获得其价值



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

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

https://docs.oracle.com/javase/7/docs/platform/jvmti/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 %dn", error);
    }
    printf("Field %s has sig %sn", field_name, field_sig);
    if (strcmp("I", field_sig) == 0) {
        int_value = env->GetIntField(object_value, fields[i]); <-- BREAKS
        printf("Value %dn", int_value);
    }
}

这破裂了,因为它在静态INT字段上被称为。我该如何确定此处的场静态?

您可以使用以下代码获取字段修饰符,然后检查静态修饰符 -

   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);
    }

相关内容

  • 没有找到相关文章

最新更新