友情支持
如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜
有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。
公众号的微信号是: jikerizhi 。因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。 |
72. Field
属性操作方法 Field#set(Object obj, Object value)
和 Field#get(Object obj)
底层都是委托到 jdk.internal.reflect.FieldAccessor
实现。
FieldAccessor
接口有很多的实现,FieldAccessor
接口实例是通过 jdk.internal.reflect.ReflectionFactory
这个工厂构造的:
1
2
3
4
5
6
7
8
9
10
11
12
13
public FieldAccessor newFieldAccessor(Field field, boolean override) {
checkInitted();
Field root = langReflectAccess.getRoot(field);
if (root != null) {
// FieldAccessor will use the root unless the modifiers have
// been overrridden
if (root.getModifiers() == field.getModifiers() || !override) {
field = root;
}
}
return UnsafeFieldAccessorFactory.newFieldAccessor(field, override);
}
最终委托到 UnsafeFieldAccessorFactory#newFieldAccessor()
。
UnsafeObjectFieldAccessorImpl
中除了 get(Object obj)
和 set(Object obj, Object value)
方法,其他方法都是直接抛出 IllegalArgumentException
。而 get(Object obj)
和 set(Object obj, Object value)
底层分别依赖于 jdk.internal.misc.Unsafe
的 putObject(obj, fieldOffset, value)
和 getObject(obj, fieldOffset)
方法。而属性的内存偏移地址是在 UnsafeObjectFieldAccessorImpl
的父类 UnsafeFieldAccessorImpl
的构造函数中计算出来的。
属性反射操作 Field
的 setXX
和 getXX
方法最终委托到 jdk.internal.misc.Unsafe
的 putXX
和 getXX
方法,而属性的内存偏移地址是通过 jdk.internal.misc.Unsafe
的 staticFieldBase()
、staticFieldOffset
和 objectFieldOffset
几个方法计算的。