JVMTI - Получить объект для поля в классе

У меня проблема с 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) и field (jfieldID) или что-то подобное, чтобы я мог вызывать SetTag(...) для всех статических полей. Есть какой-то метод для этого?

Я использую эту документацию в качестве ссылки: http://docs.oracle.com/javase/7/docs/platform/jvmti/jvmti.html

Спасибо!

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.

Другие вопросы по тегам