可以使用反射获得类中的瞬态字段吗

Posted

技术标签:

【中文标题】可以使用反射获得类中的瞬态字段吗【英文标题】:Can a transient field in a class be obtained using reflection 【发布时间】:2011-01-16 10:29:11 【问题描述】:

可以使用反射获得类中的transient 字段吗? (使用getDeclaredField(..)

【问题讨论】:

您找到解决方法了吗? 【参考方案1】:

是的,这是一个正常的字段。您可以通过以下方式检查它是否是瞬态的:

Modifier.isTransient(field.getModifiers());

瞬态: Java 编程语言中的一个关键字,表示字段不是对象的序列化形式的一部分。当一个对象被序列化时,它的瞬态字段的值不包括在序列表示中,而它的非瞬态字段的值被包括在内。

所以没有逻辑理由不能通过反射访问它。被忽略的是字段的值(有时),而不是字段本身。

(顺便说一句,是什么阻碍了您尝试致电getDeclaredField("yourTransientField")?)

【讨论】:

【参考方案2】:

transient 表示该字段不会被序列化。该字段仍由类声明,因此对于反射来说是公平的游戏。

【讨论】:

【参考方案3】:

在所有需要序列化的对象中,有一些不需要序列化。这就是为什么这个对象用关键字transient标记的原因。

【讨论】:

【参考方案4】:

transient 字段与反射无关。该关键字仅表示应在Java serialization 过程中跳过字段。所以反射可以像访问任何其他字段一样访问transient 字段。

【讨论】:

以上是关于可以使用反射获得类中的瞬态字段吗的主要内容,如果未能解决你的问题,请参考以下文章

用作锁的瞬态最终字段为空

Castle Windsor:我的瞬态组件会被垃圾回收吗?

JPA 的瞬态关键字未按预期工作

CoreData 中的瞬态属性

Java反射机制demo—获得并调用一个类中的方法

Grails 域中的瞬态属性