使用反射在Java中检查字段是否为final

51

我正在编写一个类,在某个时刻需要将其所有的Field从该类的另一个项目中分配。

我通过反射来完成它:

for (Field f:pg.getClass().getDeclaredFields()) {
    f.set(this, f.get(pg));
}

问题在于这个类包含一个 finalField。我可以通过名称跳过它,但对我来说这似乎不够优雅。

使用反射,在Java中检查一个 Field 是否为 final 的最佳方法是什么?

2个回答

114

不是很“面向对象”。好奇API设计者的考虑是什么... - AlikElzin-kilaka
@AlikElzin-kilaka 我的猜测是性能。这些修饰符可能被实现为位域(具有值1、2、4、8、16等)。这个逻辑在“Modifier”类中,它是其“唯一真相”的来源。由于它在“Field”本身中表示为一个整数,所以您无法向其添加方法(因为原语在Java和大多数其他编程语言中都是不可继承的)。 - Per Lundberg

8
您可以在Field变量上使用getModifiers()方法:
if ((f.getModifiers() & Modifier.FINAL) == Modifier.FINAL)
{
    //this is final field
}

嗨,我知道这是一个旧帖子了,但是这里的if语句是如何工作的呢?它让我感到困惑。我本以为f.getModifiers() == Modifier.FINAL会起作用的…… - Alan Smith
1
@AlanSmith getModifiers 返回一个位掩码,每个设置的位表示一个特定的修饰符。为了检查某个特定的修饰符,你需要检查是否已经设置了该特定的位——因此需要使用按位与运算。 - Aleks G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接