我正在阅读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是一个迭代器?
1条答案
按热度按时间t5zmwmid1#
看起来JavaFieldStream是一个迭代器?
正确。
它在“jdk 17 u/src/hotspot/share/oops/fieldStreams.hpp”中声明
文件中的注解说明(对于FieldStreamBase):
提示:
find jdk17u -type f | xargs grep JavaFieldStream | less