假设我有一个成员变量为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
无论如何,您需要在运行时执行此检查。