Java 有没有办法静态访问注释中的默认值?

Java 有没有办法静态访问注释中的默认值?,java,static,annotations,Java,Static,Annotations,假设您有一些注释Annot: @Retention(/*your retention policy*/) @Target(/*targeted element type*/) public @interface Annot { String value() default "Hello World!"; } String value() default Processor.ANNOT_VALUE_DEFAULT; 在一些相关的代码(例如注释处理器)中,您需要value()注释字段的默

假设您有一些注释
Annot

@Retention(/*your retention policy*/)
@Target(/*targeted element type*/)
public @interface Annot {
    String value() default "Hello World!";
}
String value() default Processor.ANNOT_VALUE_DEFAULT;
在一些相关的代码(例如注释处理器)中,您需要
value()
注释字段的默认值,而不需要访问使用
@Annot
注释的类。当然,你也可以这么做

public static final String ANNOT_VALUE_DEFAULT = "Hello World!";
在处理器类中,然后在
@Annot
中更改以下内容:

@Retention(/*your retention policy*/)
@Target(/*targeted element type*/)
public @interface Annot {
    String value() default "Hello World!";
}
String value() default Processor.ANNOT_VALUE_DEFAULT;
Processor
是注释处理器的类名)。虽然这在
String
s上可以正常工作,但是当
value()
类型是
enum
时,
@Annot
中的更改会失败。对于其他值,它也可能失败,但是
enum
是我的用例的一部分,因此,如果这不起作用,那么其他类型是否起作用也无关紧要

当然,现在解决这个问题的最简单方法是分别在
@Annot
处理器
中指定默认值。但每个程序员都知道,复制常量通常不是一个好主意。您可能希望自动将一个部分(例如
@Annot
)中的更改反映在其他部分(例如
处理器
)中。要使其工作,您必须能够做到:

var defaultVal = Annot.value(); // statically (without an instance annotated with @Annot) access default value
那么,这种静态访问有可能吗

部分解 我现在并不迫切需要找到解决方案,因为我已经找到了一个半方便的解决方法(见我的答案)。不过,由于解决方案有点“黑客”,我想知道是否有更优雅的方法来实现这一点。

解决方案 如果没有令人满意的解决方案,但您,读者,确实需要一个解决方案,请查看此解决方案:

因此,问题是您希望访问默认值,而不需要为提供带有
@Annot
注释的类。谁说你没有机会上这样的课?只需将这个(最好是包私有)类添加到源代码中:

@Annot
class DefaultAnnotValues {
    private static final Annot ANNOT = DefaultAnnotValue.class.getAnnotation(Annot.class);

    static SomeEnum value = ANNOT.value();

    // add all other enum fields with default values here

    private DefaultAnnotValues() {
    }
}
现在,您可以访问批注的所有默认值,当您更改批注定义中的默认值时,它将自动反映到使用这些默认值的位置。

解决方法 如果没有令人满意的解决方案,但您,读者,确实需要一个解决方案,请查看此解决方案:

因此,问题是您希望访问默认值,而不需要为提供带有
@Annot
注释的类。谁说你没有机会上这样的课?只需将这个(最好是包私有)类添加到源代码中:

@Annot
class DefaultAnnotValues {
    private static final Annot ANNOT = DefaultAnnotValue.class.getAnnotation(Annot.class);

    static SomeEnum value = ANNOT.value();

    // add all other enum fields with default values here

    private DefaultAnnotValues() {
    }
}

现在,您可以访问批注的所有默认值,并且当您更改批注定义中的默认值时,它将自动反映到使用这些默认值的任何位置。

无用的旁注:您还可以在需要的地方创建
DefaultAnnotValues
private static(甚至是方法本地类)看来你对自己的问题有了答案。请把它分成自己的答案,你不想把它作为问题的一部分。@SotiriosDelimanolis这不是我问题的答案。相反,我的问题是,是否有另一种更优雅的方法来解决这个问题,而不是我给出的解决方法。但是,作为读者,你真的需要一个解决方案,看看这个解决方法听起来真的像是一个答案。无用的旁注:你也可以在需要的地方使用
DefaultAnnotValues
private static(甚至是本地类的方法)似乎你对自己的问题有一个答案。请把它分割成自己的答案,你不想把它作为问题的一部分。@SotiriosDelimanolis这不是我问题的答案。我的问题是,是否有比我给定的解决方法更优雅的方法来解决这个问题,但你,读者,真的需要一个解决方法ion,看看这个解决方法听起来真的像是一个答案。