2017-02-24 7 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); 
    } 
関連する問題