2017-02-24 146 views
2

我正在寫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字段。我怎麼能確定是在這裏的字段靜態?

回答

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