在Unsafe.cpp(JDK源代码)的方法:static jlong find_field_offset中,JavaFieldStream意味着什么?

m4pnthwp  于 2022-12-03  发布在  Java
关注(0)|答案(1)|浏览(86)

我正在阅读BufferedInputStream的Java源代码。我注意到有一个私有字段:BUF_OFFSET. enter image description here

private static final long BUF_OFFSET
            = U.objectFieldOffset(BufferedInputStream.class, "buf");

我试着检查它,然后我发现了方法:objectFieldOffset 1。它是一个本地方法。所以我从www.example.com下载了JDK源代码(jdk-17 + 35)github.https://github.com/openjdk/jdk/tree/jdk-17%2B35。最后我找到了 jlong find_field_offset 方法。
除了JavaFieldStreamenter image description here之外,我基本上可以理解代码

static jlong find_field_offset(jclass clazz, jstring name, TRAPS) {
  assert(clazz != NULL, "clazz must not be NULL");
  assert(name != NULL, "name must not be NULL");

  ResourceMark rm(THREAD);
  char *utf_name = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(name));

  InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));

  jint offset = -1;
  for (JavaFieldStream fs(k); !fs.done(); fs.next()) {
    Symbol *name = fs.name();
    if (name->equals(utf_name)) {
      offset = fs.offset();
      break;
    }
  }
  if (offset < 0) {
    THROW_0(vmSymbols::java_lang_InternalError());
  }
  return field_offset_from_byte_offset(offset);
}

我试着在谷歌上搜索,但是没有找到。我试着在Java官方文档中找到,也没有。看起来JavaFieldStream是一个迭代器?

t5zmwmid

t5zmwmid1#

看起来JavaFieldStream是一个迭代器?
正确。
它在“jdk 17 u/src/hotspot/share/oops/fieldStreams.hpp”中声明
文件中的注解说明(对于FieldStreamBase):

// The is the base class for iteration over the fields array
// describing the declared fields in the class.  Several subclasses
// are provided depending on the kind of iteration required.  The
// JavaFieldStream is for iterating over regular Java fields and it
// generally the preferred iterator.  InternalFieldStream only
// iterates over fields that have been injected by the JVM.
// AllFieldStream exposes all fields and should only be used in rare
// cases.

提示:find jdk17u -type f | xargs grep JavaFieldStream | less

相关问题