Есть ли способ передать константу в аннотацию в Groovy?

В 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

Кто-нибудь знает, что мне нужно сделать, чтобы заставить это работать, или если это возможно? Спасибо за любую помощь или прозрение, которое вы можете предоставить.

Ответ 1

Я столкнулся с этой же проблемой, и ответ Джерарда работает, но мне не нужно создавать новый класс Constants, просто обратитесь к существующему классу.

Например:

@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 репутации.

Ответ 2

Вопрос, предложенный здесь как (accessing-static-field-in-annotation), отличается от этого, поскольку ответ был сделан на окончание строки, которая уже является случай здесь. У меня есть способ сделать эту работу, поэтому я думаю, что лучше всего, если я отвечу здесь другим людям с тем же вопросом!:)

Вышеприведенный код не работает, но указание строки, передаваемой аннотации в качестве поля в другом классе, работает нормально, как ни странно:

    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
        }
    }

Я точно не знаю, почему одна из этих ситуаций работает, а другая - нет. Читая комментарии в ошибке, упомянутой в вышеупомянутом аналогичном вопросе, кажется, что разработчики Groovy столкнулись с проблемами, охватывающими все случаи, которые охватывает Java относительно передачи постоянных ссылок на строки в качестве параметров аннотации.