我正在閱讀 BufferedInputStream 的 Java 源代碼。我注意到有一個私有欄位:BUF_OFFSET。在此處輸入影像描述
private static final long BUF_OFFSET
= U.objectFieldOffset(BufferedInputStream.class, "buf");
我試著查了一下,然后我找到了方法:objectFieldOffset1。它是一個本地方法。所以我從github.https://github.com/openjdk/jdk/下載了JDK源代碼(jdk-17 35) tree/jdk-17+35 終于找到了jlong??的find_field_offset方法。
除了JavaFieldStream enter 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 是一個迭代器?
uj5u.com熱心網友回復:
看起來像 JavaFieldStream 是一個迭代器?
正確的。
它在“jdk17u/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
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/537443.html
標籤:爪哇C
