将注释传递给Kotlin中的函数

时间:2018-07-30 09:15:54

标签: kotlin cdi

如何将注释实例传递给函数?

我想调用Java方法AbstractCDI.select(Class<T> type, Annotation... qualifiers)。但是我不知道如何将注释实例传递给此方法。

像这样调用构造函数 cdiInstance.select(MyClass::javaClass, MyAnnotation())  不允许使用,也不允许@ Annotation-Syntax cdiInstance.select(MyClass::javaClass, @MyAnnotation)作为参数。我该如何存档?

2 个答案:

答案 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,您也可以致电以下电话(findAnnotationKAnnotatedElement上的扩展功能):

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(请参阅他的文章)。