使用反射检查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会起作用……@alanmith
getModifiers
返回一个位掩码,每个单独的设置位表示一个特定的修饰符。为了检查一个特定的修饰符,您需要检查是否设置了该特定的位-因此是按位的“and”。不是非常面向对象的。好奇地想知道API设计师的考虑因素…@AlikElzin kilaka我的猜测:性能。修饰符可能实现为位字段(具有值1、2、4、8、16等)。这个逻辑在
修饰符
类中,它是它的“唯一真理来源”。由于它在
字段
本身中表示为一个整数,因此不能向其添加方法(因为原语在Java和大多数其他编程语言中是不可继承的)。