访问 class 个字段的值
Accessing class fields for their value
我正在编写 JVMTI 代理,并且在我获得 jobject 时尝试访问特定的 class 字段值。我知道它们位于堆上而不是堆栈上。
不幸的是,看着这个对我没有帮助。
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 字段上调用的。我如何确定这里的字段是静态的?
您可以使用以下代码获取 Field Modifier,然后检查 STATIC modifier -
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);
}
我正在编写 JVMTI 代理,并且在我获得 jobject 时尝试访问特定的 class 字段值。我知道它们位于堆上而不是堆栈上。
不幸的是,看着这个对我没有帮助。
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 字段上调用的。我如何确定这里的字段是静态的?
您可以使用以下代码获取 Field Modifier,然后检查 STATIC modifier -
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);
}