反射:这个成员变量是否对应于这个字段



假设我有一个成员变量为int c的类。假设还有一个Field f。我想确认一下f是否代表c。我可以:

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

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

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

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

按照"使用断言编程"的指导方针,我们可以推断出这是使用断言的适用情况:

每个断言都包含一个布尔表达式,您认为该表达式在断言执行时为真。如果不为真,系统将抛出一个错误。通过验证布尔表达式确实为真,断言确认了您对程序行为的假设,增加了您对程序没有错误的信心。

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

话虽这么说:从问题描述中不清楚你的设置到底是什么样子的,但这个片段将按照我的解释方式行事:

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;将简单地打印"We reached this point"int a = 5;将显示一个漂亮的错误:

Exception in thread "main" java.lang.AssertionError
at Main.main(Main.java:38)

不像有类字面值那样有字段字面值。这基本上意味着您可以引用字段的唯一方法是通过其名称的String值。您将无法获得IDE对字段的重构功能,我认为这就是您想要这样做的原因。

public class Example {} ==> public class Refactored
... 
Example.class ==> Refactored.class // would cause compiler error if wasn't changed

无论如何,您需要在运行时执行此检查。

相关内容

  • 没有找到相关文章

最新更新