Java 相当于;Abc.class.getName();田野

Java 相当于;Abc.class.getName();田野,java,reflection,Java,Reflection,在Java中,您可以编写: System.out.println(Abc.class.getName()) 它将始终打印正确的值,即使类Abc被移动或重命名 对于字段名,最接近的是什么 换句话说,我可以编写什么代码来始终为我提供类中某个字段的“当前”名称,即使该字段已重命名。理想情况下,如果字段被完全删除,它也将无法编译。或者在静态初始化期间,至少在访问类时失败 我希望这能简化“变更跟踪”系统。它不像“bean属性”,因为这些名称在类本身之外是不可见的 顺便说一句,没有“本地”的方法可以做到这一

在Java中,您可以编写:

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

它将始终打印正确的值,即使类Abc被移动或重命名

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

换句话说,我可以编写什么代码来始终为我提供类中某个字段的“当前”名称,即使该字段已重命名。理想情况下,如果字段被完全删除,它也将无法编译。或者在静态初始化期间,至少在访问类时失败

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

顺便说一句,没有“本地”的方法可以做到这一点,但我希望有一些注释和/或反射技巧可以做到这一点

我将写下我现在正在做的事情(最小简化):

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

OTOH,如果有像Abc.isSwappable(或Abc#isSwappable)之类的语法,我会保留常量,直接写出来

我能做的是(一次)检查常量(通过使用一些明确的命名约定),并确保每个常量都有一个同名的实例字段。但它并不能真正保证在使用isSwappable的地方使用可交换的功能。

它看起来非常简单

    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());
    }

'即使Abc类被移动或重命名。'在什么意义上?如果您删除Abc类,那么您的程序将无法编译,也无法运行!对我来说,如果名称不是为您查找字段的有效条件,那么您可以选择字段的类型/泛型类型。您知道(thx到自定义注释?)这个类有3个X类型的字段,2个Y类型的字段。。。然后你检查,如果仍然是这样,如果不是失败了,这就是你想要的吗?@Sebastien:在这种情况下,我想我能想象的最接近你需求的东西是类似于JPA静态元模型生成器的东西。它不必自动处理重命名或移动,但至少当某些内容发生更改并需要更新时,您会遇到编译器错误。我认为您误解了他们的问题。他希望直接访问该字段。由于没有这样的人,我建议一个解决办法。我不认为这对我有什么用处。我不需要所有字段的名称,而是特定字段的名称。如果我有一个字段“age”,我想在该字段的getter和setter中使用该字段的“name”。当然,我可以在代码中的任何地方获得所有字段的名称,但我不知道在实际的getter/setter中访问的字段是哪一个。Atm,我只是将名称键入字符串,但如果有人重构代码,字符串将与实际字段名不匹配。好的,可能我没有正确理解问题。你能提供一个伪代码示例吗?
    for (Field field : getClass().getFields()) {
        System.out.println(field.getName());
        MyAnnotation annotation = field.getAnnotation( MyAnnotation.class );
        System.out.println(annotation.value());
    }