JVMTI - 为 class 中的字段获取对象
JVMTI - Get object for field in class
我遇到了 JVMTI 问题。
我想访问 class 的每个静态字段并对其进行标记。我可以获得每个字段的签名,我可以查明它是否是静态的,但我还没有找到一种方法来为应该标记的字段获取工作对象。这是(缩短的)我目前所拥有的:
jint fieldCount;
jfieldID* fields_ptr;
int i = 0;
jint err;
err = (*env)->GetClassFields(env, *klass, &fieldCount, &fields_ptr);
for(i = 0; i < fieldCount; i++)
{
jfieldID field = fields_ptr[i];
char* name_ptr;
char* signature_ptr;
char* generic_ptr;
jint accessFlags;
err = (*env)->GetFieldName(env, *klass, field, &name_ptr, &signature_ptr, &generic_ptr);
(*env)->GetFieldModifiers(env, *klass, field, &accessFlags);
if (accessFlags & 0x0008)
fprintf(file, "STATIC ");
else
fprintf(file, "NOT STATIC ");
fprintf(file, "Field %s of type %s\n", name_ptr, signature_ptr);
}
//TODO: Something like this:
//if (accessFlags & 0x0008) {
// jobject obj = (*env)->GetStaticField(env, *klass, field);
// (*env)->SetTag(env, obj, 1);
//}
我现在需要的是一种方法,该方法基于 *klass (jclass) 和字段 (jfieldID) 或类似的东西给我一个工作对象,这样我就可以在所有静态上调用 SetTag(...)领域。有什么方法吗?
我使用此文档作为参考:http://docs.oracle.com/javase/7/docs/platform/jvmti/jvmti.html
谢谢!
我刚刚在 Facebook 上收到了回答我问题的回复。
这是 JNI 参考:
http://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html
在那里你可以找到以下方法:
Get<type>Field Routines:
NativeType Get<type>Field(JNIEnv *env, jobject obj, jfieldID fieldID);
GetStatic<type>Field Routines:
NativeType GetStatic<type>Field(JNIEnv *env, jclass clazz, jfieldID fieldID);
所以我可以使用 GetObjectField() 和 GetStaticObjectField(),它们 return 一个我可以用来标记它的作业对象。
我的错误是只查看了 JVMTI 文档,而没有使用 JNI 参考。
我遇到了 JVMTI 问题。
我想访问 class 的每个静态字段并对其进行标记。我可以获得每个字段的签名,我可以查明它是否是静态的,但我还没有找到一种方法来为应该标记的字段获取工作对象。这是(缩短的)我目前所拥有的:
jint fieldCount;
jfieldID* fields_ptr;
int i = 0;
jint err;
err = (*env)->GetClassFields(env, *klass, &fieldCount, &fields_ptr);
for(i = 0; i < fieldCount; i++)
{
jfieldID field = fields_ptr[i];
char* name_ptr;
char* signature_ptr;
char* generic_ptr;
jint accessFlags;
err = (*env)->GetFieldName(env, *klass, field, &name_ptr, &signature_ptr, &generic_ptr);
(*env)->GetFieldModifiers(env, *klass, field, &accessFlags);
if (accessFlags & 0x0008)
fprintf(file, "STATIC ");
else
fprintf(file, "NOT STATIC ");
fprintf(file, "Field %s of type %s\n", name_ptr, signature_ptr);
}
//TODO: Something like this:
//if (accessFlags & 0x0008) {
// jobject obj = (*env)->GetStaticField(env, *klass, field);
// (*env)->SetTag(env, obj, 1);
//}
我现在需要的是一种方法,该方法基于 *klass (jclass) 和字段 (jfieldID) 或类似的东西给我一个工作对象,这样我就可以在所有静态上调用 SetTag(...)领域。有什么方法吗?
我使用此文档作为参考:http://docs.oracle.com/javase/7/docs/platform/jvmti/jvmti.html
谢谢!
我刚刚在 Facebook 上收到了回答我问题的回复。
这是 JNI 参考: http://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html
在那里你可以找到以下方法:
Get<type>Field Routines:
NativeType Get<type>Field(JNIEnv *env, jobject obj, jfieldID fieldID);
GetStatic<type>Field Routines:
NativeType GetStatic<type>Field(JNIEnv *env, jclass clazz, jfieldID fieldID);
所以我可以使用 GetObjectField() 和 GetStaticObjectField(),它们 return 一个我可以用来标记它的作业对象。
我的错误是只查看了 JVMTI 文档,而没有使用 JNI 参考。