当前位置: 首页 > 知识库问答 >
问题:

是否有方法静态地访问注释中的默认值?

云和硕
2023-03-14

假设您有一些注释Annot

@Retenthtml" target="_blank">ion(/*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是我的用例的一部分,因此如果这不起作用,其他类型是否起作用也无关紧要。

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

var defaultVal = Annot.value(); // statically (without an instance annotated with @Annot) access default value

那么,这种静态访问有可能吗?

我现在并不迫切需要找到一个解决方案,因为我已经找到了一个半方便的变通方法(见我的答案)。尽管如此,因为变通方法有点“hacky”,我想知道是否有更优雅的方法来做到这一点。

共有1个答案

祝昊东
2023-03-14

如果事实证明没有令人满意的解决方案,但是读者真的需要一个解决方案,看看这个变通方法

所以,问题是您想访问默认值,而不需要提供一个注释为@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() {
    }
}

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

 类似资料:
  • 这将打印a.a=50 但是,如果我将更改为,那么我可以如何访问该变量呢?

  • Kotlin中的注释可以有不同的使用站点目标,如下所述:https://kotlinlang.org/docs/reference/annotations.html#annotation-使用站点目标 我的问题是:如果没有明确定义use-site,那么在类中注释属性时的默认目标是什么? 背景 我尝试用Jongo作为Kotlin中的MongoDB客户端,但在注释id字段时遇到了问题。Jongo不能正

  • css中注释的作用包括帮助你组织样式、以后你看自己的代码时明白为什么这样写,以及简单的样式说明。但是,你并不希望每个浏览网站源码的人都能看到所有注释。 sass另外提供了一种不同于css标准注释格式/* ... */的注释语法,即静默注释,其内容不会出现在生成的css文件中。静默注释的语法跟JavaScriptJava等类C的语言中单行注释的语法相同,它们以//开头,注释内容直到行末。 body

  • 我有一个关于静态方法访问的问题。我有一个类,其中有4个静态方法。如代码所示: } 我正在从下面的代码调用来自onLoadShipperDetailsListCtrl()的setSortingEnable()方法: } 因此,如果我从其他类调用setSortingEnabled()方法,我会认为它是公共的,而其他方法是私有的,但它会给我一个错误:Java . lang . nosuchmethode

  • 当我注意到现在可以在接口中定义静态和默认方法时,我正在通过接口学习。 请解释两者的区别,如果有一个我们什么时候会使用它的例子,那就好了。界面上有点混乱。

  • 为什么会这样?我的意思是,访问私有变量。