使用反射检查java中的字段是否为final
我正在编写一个类,在某个时候它必须从这个类的另一个项中分配所有的使用反射检查java中的字段是否为final,java,Java,我正在编写一个类,在某个时候它必须从这个类的另一个项中分配所有的字段 我是通过思考做到的: for (Field f:pg.getClass().getDeclaredFields()) { f.set(this, f.get(pg)); } 问题是,该类包含一个字段,它是final。我可以略过它的名字,但对我来说,这似乎一点也不优雅 使用反射检查java中的字段是否为final的最佳方法是什么?最佳且唯一的方法是:Modifier.isFinal(f.getModifiers())
字段
我是通过思考做到的:
for (Field f:pg.getClass().getDeclaredFields()) {
f.set(this, f.get(pg));
}
问题是,该类包含一个字段
,它是final
。我可以略过它的名字,但对我来说,这似乎一点也不优雅
使用反射检查java中的字段是否为final
的最佳方法是什么?最佳且唯一的方法是:Modifier.isFinal(f.getModifiers())
参考:
您可以在字段
变量上使用getModifiers()
方法:
if ((f.getModifiers() & Modifier.FINAL) == Modifier.FINAL)
{
//this is final field
}
嗨,我意识到这是一篇老文章,但是if语句在这里是如何工作的呢?这让我很困惑。我假设f.getModifiers()==Modifier.FINAL会起作用……@alanmithgetModifiers
返回一个位掩码,每个单独的设置位表示一个特定的修饰符。为了检查一个特定的修饰符,您需要检查是否设置了该特定的位-因此是按位的“and”。不是非常面向对象的。好奇地想知道API设计师的考虑因素…@AlikElzin kilaka我的猜测:性能。修饰符可能实现为位字段(具有值1、2、4、8、16等)。这个逻辑在修饰符类中,它是它的“唯一真理来源”。由于它在字段
本身中表示为一个整数,因此不能向其添加方法(因为原语在Java和大多数其他编程语言中是不可继承的)。