【问题标题】:JVMTI - Get object for field in classJVMTI - 获取类中字段的对象
【发布时间】:2015-05-02 11:12:06
【问题描述】:

我的 JVMTI 有问题。

我想访问一个类的每个静态字段并对其进行标记。我可以获得每个字段的签名,我可以确定它是否是静态的,但我还没有找到一种方法来为应该标记的字段获取作业。这是(缩短的)我到目前为止的内容:

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

谢谢!

【问题讨论】:

    标签: java oracle jvm java-native-interface jvmti


    【解决方案1】:

    我刚刚在 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() 返回一个作业对象,然后我可以使用它来标记它。

    我的错误是只查看 JVMTI 文档,而不是使用 JNI 参考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-12
      • 1970-01-01
      相关资源
      最近更新 更多