【问题标题】:Accessing class fields for their value访问类字段的值
【发布时间】:2017-02-24 14:31:35
【问题描述】:

我正在编写 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 字段上调用的。如何确定此处的字段是否为静态?

【问题讨论】:

    标签: java java-native-interface jvmti


    【解决方案1】:

    您可以使用以下代码获取字段修饰符,然后检查 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);
        }
    

    【讨论】:

      猜你喜欢
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      • 2011-09-26
      • 2021-07-25
      相关资源
      最近更新 更多