如何将注释实例传递给函数?
我想调用Java方法AbstractCDI.select(Class<T> type, Annotation... qualifiers)
。但是我不知道如何将注释实例传递给此方法。
像这样调用构造函数
cdiInstance.select(MyClass::javaClass, MyAnnotation())
不允许使用,也不允许@ Annotation-Syntax cdiInstance.select(MyClass::javaClass, @MyAnnotation)
作为参数。我该如何存档?
答案 0 :(得分:2)
使用CDI
时,您通常还可以使用AnnotationLiteral
,或者至少可以实现类似的操作。
如果您想使用注释选择一个班级,则可以使用以下技巧:
cdiInstance.select(MyClass::class.java, object : AnnotationLiteral<MyAnnotation>() {})
或者,如果您需要特定的值,则可能需要实现特定的AnnotationLiteral
类。在Java中,其工作方式如下:
class MyAnnotationLiteral extends AnnotationLiteral<MyAnnotation> implements MyAnnotation {
private String value;
public MyAnnotationLiteral(String value) {
this.value = value;
}
@Override
public String[] value() {
return new String[] { value };
}
}
但是,在Kotlin中,您无法实现注释并扩展AnnotationLiteral
,或者也许我只是不知道如何(请参见相关问题:Implement (/inherit/~extend) annotation in Kotlin)。
如果您想继续使用反射来访问注释,那么您应该宁愿使用Kotlin反射方式:
ClassWithAnno::class.annotations
ClassWithAnno::methodWithAnno.annotations
致电filter
等获得您想要的Annotation
,或者,如果您知道那里只有一个Annotation
,您也可以致电以下电话(findAnnotation
是KAnnotatedElement
上的扩展功能):
ClassWithAnno::class.findAnnotation<MyAnnotation>()
ClassWithAnno::methodWithAnno.findAnnotation<MyAnnotation>()
答案 1 :(得分:0)
一个人可以用注解注释一个方法或字段,并通过反射获得它:
this.javaClass.getMethod("annotatedMethod").getAnnotation(MyAnnotation::class.java)
或者根据罗兰(Roland)的建议,上述内容是Kotlin版本:
MyClass::annotatedMethod.findAnnotation<MyAnnotation>()!!
如罗兰(Roland)对于CDI所建议的那样,最好使用AnnotationLiteral
(请参阅他的文章)。