假设我有一个带有成员变量 int c 的类。
假设我也有一个 Field f 。我想检查 f 是否代表 c 。我可以:

f.getName().equals("c")

但我正在寻找一个解决方案,如果我要重命名 c ,编译器会以某种方式提醒我。类似 f == c.getField() 的东西。

我的猜测是没有办法做到这一点,但我想确认一下!

最佳答案

assert 语句与 -ea 开关结合使用,您可以验证字段名称是否保持不变。

根据 "Programming With Assertions" guidelines 我们可以推断出这是使用它们的适用情况:



异常用于捕获异常行为,断言用于验证不变假设。

话虽如此:从问题描述中不清楚您的设置究竟是什么样子,但此代码段将按照我的解释方式行事:

public class Main {
    int c = 5;

    public static void main(String[] args) {
        Field f = null;
        try {
            f = ReflectionTest.class.getDeclaredField("c");
        } catch (NoSuchFieldException | SecurityException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            return;
        }

        assert hasMember(f);

        System.out.println("We reached this point");
    }

    private static boolean hasMember(Field f) {
        for (Field localField : Main.class.getDeclaredFields()) {
            if (localField.getName().equals(f.getName())) {
                return true;
            }
        }

        return false;
    }
}

class ReflectionTest {
    int c = 10;
}

使用 int c = 5; 将简单地打印“我们到达了这一点”,而 int a = 5; 将显示一个很好的错误:
Exception in thread "main" java.lang.AssertionError
at Main.main(Main.java:38)

关于java - 反射(reflection):这个成员变量是否对应这个Field,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23891624/

10-15 10:27