有没有一种方法可以静态地访问注释中的默认值



假设您有一些注释Annot:

@Retention(/*your retention policy*/)
@Target(/*targeted element type*/)
public @interface Annot {
String value() default "Hello World!";
}

在一些相关的代码中,比如注释处理器,您需要value()注释字段的默认值,而无权访问用@Annot注释的类。当然你可以简单地做

public static final String ANNOT_VALUE_DEFAULT = "Hello World!";

在您的处理器类中,然后在@Annot中更改以下内容:

String value() default Processor.ANNOT_VALUE_DEFAULT;

(Processor是注释处理器的类名(。虽然这适用于Strings,但当value()类型为enum时,对@Annot的更改将失败。对于其他值,它可能也会失败,但enum是我的用例的一部分,因此,如果这不起作用,那么其他类型是否起作用也没关系。

当然,现在解决这个问题的最简单方法是分别在@AnnotProcessor中指定默认值。但每个程序员都知道,一般来说,重复常量不是一个好主意。您可能希望在其他部分(例如Processor(中自动反映一个部分(例如,@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() {
}
}

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

最新更新