相当于" Abc.class.getName()"对于字段

时间:2016-06-07 15:27:16

标签: java reflection

在Java中你可以写:

System.out.println(Abc.class.getName());

即使移动或重命名了类Abc,也会始终打印正确的值

对于字段名称,您最接近的是什么?

换句话说,我可以编码什么,总能给我带来当前的"即使重命名该字段,类中字段的名称也是如此。理想情况下,如果完全删除该字段,它也将无法编译。或者至少在静态初始化期间访问类时失败。

我希望这可以简化"更改跟踪"系统。它不太像bean" bean属性",因为这些名称在类本身之外是不可见的。

AFAIK,没有"本地人"这样做的方法,但我希望可能有一些注解和/或反射的技巧可以完成这项工作。

我会写下我现在正在做的事情(最低限度简化):

private static final String IS_SWAPPABLE = "isSwappable";
// ...
private boolean isSwappable;
// ...
public boolean isSwappable() {
    if ((clientChanges != null) &&
                  clientChanges.containsKey(IS_SWAPPABLE)) {
        return (Boolean) clientChanges.get(IS_SWAPPABLE);
    }
    return isSwappable;
}

public boolean setSwappable(final boolean newSwappable) {
    if (isSwappable() != newSwappable) {
        isSwappable = newSwappable;
        onFieldChange(IS_SWAPPABLE, newSwappable);
        return true;
    }
    return false;
}

我想要的是一些"魔法"将IS_SWAPPABLE的值设置为" isSwappable"这样如果isSwappable被重命名,那么IS_SWAPPABLE将被适当更新。

OTOH,如果有像Abc.isSwappable(或Abc#isSwappable)这样的语法,或者其他什么,我会把自己作为常量,直接写出来。

我可以做的atm是(一次)查看常量(通过使用一些明确的命名约定),并确保每个都有一个具有相同名称的实例字段。但是,在使用isSwappable的地方使用IS_SWAPPABLE并不是非常保证。

1 个答案:

答案 0 :(得分:-1)

看起来很简单。

    for (Field field : getClass().getFields()) {
        System.out.println(field.getName());
    }

然后,您可以使用自己的注释标记字段,然后像这样读取它们的值

    for (Field field : getClass().getFields()) {
        System.out.println(field.getName());
        MyAnnotation annotation = field.getAnnotation( MyAnnotation.class );
        System.out.println(annotation.value());
    }