[英]Is there a way to pass a constant to an annotation in 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
}
}
在這里,使用@MyGroovyAnnotation
注釋方法myMethod
,如果我傳遞像@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
有沒有人知道我需要做些什么來使這個工作,或者甚至可能? 感謝您提供的任何幫助或見解。
我遇到了同樣的問題並且Gerard的答案有效,但我不需要創建一個新的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的聲譽。
這里建議類似的問題( access-static-field-in-annotation )與此不同,因為答案是使String final,這就是這里的情況。 我已經找到了一種方法來完成這項工作,所以我想我最好在這里回答有同樣問題的其他人! :)
上面的代碼不起作用,但指定要作為另一個類中的字段傳遞給注釋的String工作正常,奇怪的是:
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中的注釋,似乎Groovy開發人員遇到了一些問題,這些問題涵蓋了Java將常量String引用作為注釋參數傳遞的所有情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.