【问题标题】:Is there a way to pass a constant to an annotation in Groovy?有没有办法将常量传递给 Groovy 中的注释?
【发布时间】:2014-01-22 14:49:53
【问题描述】:

在 Java 中,可以将常量 String 作为参数传递给注解,但我不知道如何在 Groovy 中做同样的事情。

例如:

    @Retention(RetentionPolicy.RUNTIME)
    @Target(value=[ElementType.METHOD])
    public @interface MyGroovyAnnotation {
        String value()
    }

    class MyGroovyClass {

        public static final String VALUE = "Something"

        @MyGroovyAnnotation(value=VALUE)
        public String myMethod(String value) {
            return value    
        }
    }

在这里,方法myMethod@MyGroovyAnnotation 注释,如果我传递一个像@MyGroovyAnnotation(value="Something") 这样的字符串文字,它可以完美地工作,但是如果我尝试像上面的例子一样传递VALUE,我得到:

来自 Eclipse:

Groovy:Expected 'VALUE' to be an inline constant of type java.lang.String in @MyGroovyAnnotation

从 GroovyConsole 运行:

expected 'VALUE' to be an inline constant of type java.lang.String not a field expression in @MyGroovyAnnotation
 at line: 20, column: 31

Attribute 'value' should have type 'java.lang.String'; but found type 'java.lang.Object' in @MyGroovyAnnotation
 at line: -1, column: -1

有没有人知道我需要做什么才能让它工作,或者是否有可能?感谢您提供的任何帮助或见解。

【问题讨论】:

  • 谢谢@tim_yates,我没发现那个。那里的问题类似,但选择的答案并不是真正的解决方案,因为它没有任何区别。我会赞成引用 groovy bug 链接的答案,但我还没有足够的声誉来做到这一点。我将检查这个错误,看看我是否可以为这个问题和那个旧问题提供更多信息。再次感谢!

标签: groovy annotations


【解决方案1】:

我遇到了同样的问题,杰拉德的回答有效,但我不需要创建一个新的常量类,只需引用现有的类。

例如:

@Retention(RetentionPolicy.RUNTIME)
@Target(value=[ElementType.METHOD])
public @interface MyGroovyAnnotation {
    String value()
}

class MyGroovyClass {

    public static final String VALUE = "Something"

    @MyGroovyAnnotation(value=MyGroovyClass.VALUE)
    public String myMethod(String value) {
        return value    
    }
}

我想对接受的答案发表评论,但我没有 50 声望。

【讨论】:

  • 感谢乔恩的反馈。我认为这比我拥有的要好。我已将接受的答案更改为这个……所以现在你有 50 个代表了! :)
  • 一年半之后,现在 Jon 拥有 1,130 个代表。增加不少!
【解决方案2】:

此处建议的类似问题 (accessing-static-field-in-annotation) 与此不同,因为答案是使 String 成为 final,这里已经是这种情况。我已经找到了完成这项工作的方法,所以我想我最好在这里为有相同问题的其他人回答! :)

上面的代码不起作用,但是指定要作为另一个类中的字段传递给注解的字符串可以正常工作,奇怪的是:

    Retention(RetentionPolicy.RUNTIME)
    @Target(value=[ElementType.METHOD])
    public @interface MyGroovyAnnotation {
        String value()
    }

    class Constants {
        public static final String VALUE = "Something"
    }

    public class MyGroovyClass {

        @MyGroovyAnnotation(value=Constants.VALUE)
        public String myMethod(String value) {
            return value
        }
    }

我不确定为什么其中一种情况有效而另一种无效。阅读上述类似问题中提到的bug 中的 cmets,Groovy 开发人员似乎遇到了涵盖 Java 涵盖的所有情况的问题,涉及将常量字符串引用作为注释参数传递。

【讨论】:

    猜你喜欢
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多