反射:此成员变量是否与此字段对应

时间:2014-05-27 14:03:33

标签: java reflection

假设我有一个包含成员变量int c的类。 假设我也有一个Field f。我想检查f是否代表c。我能做到:

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

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

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

2 个答案:

答案 0 :(得分:0)

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)

答案 1 :(得分:0)

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

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

您需要在运行时以这种或那种方式进行此检查。