2017-02-24 20 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); 
    }