在Kotlin中实现Java注释

时间:2017-06-25 20:47:59

标签: kotlin dropwizard

我正在Kotlin中实现dropwizard示例应用程序,并且在实现DateRequiredFeature时遇到了问题。 Java代码如下:

    @Provider
    public class DateRequiredFeature implements DynamicFeature {
        @Override
        public void configure(ResourceInfo resourceInfo, FeatureContext context) {
            if (resourceInfo.getResourceMethod().getAnnotation(DateRequired.class) != null) {
                context.register(DateNotSpecifiedFilter.class);
            }
        }
    }

注释定义为:

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface DateRequired {}

对于Kotlin方面我有这个功能:

    @Provider
    class DateRequiredFeature : DynamicFeature(){
        override fun configure(resourceInfo: ResourceInfo, context: FeatureContext) {
            if (resourceInfo.resourceMethod.getAnnotation(DateRequired::class.java) != null) {
                context.register(DateNotSpecifiedFilter::class.java)
            }
        }
    }

但不清楚如何实现相应的DateRequired注释,以便getAnnotation()有效。 getAnnotation()的(Java)签名是

public <T extends Annotation> T getAnnotation(Class<T> annotationClass)

注意

看起来像一个IntelliJ错误,我需要显式导入注释,尽管它在同一个包中:

...
import DateRequired

@Provider
class DateRequiredFeature : DynamicFeature {
    override fun configure(resourceInfo: ResourceInfo, context: FeatureContext) {
        if (resourceInfo.resourceMethod.getAnnotation(DateRequired::class.java) != null) {
            context.register(DateNotSpecifiedFilter::class.java)
        }
    }
}

然后一切都很好用标准的Kotlin注释annotation class DateRequired

1 个答案:

答案 0 :(得分:2)

在Kotlin中实现注释比在Java中更简单。 Kotlin中的默认RetentionPolicyRUNTIMEFUNCTIONPROPERTY_GETTERPROPERTY_SETTER已映射到Java ElementType.METHOD,例如:

import kotlin.annotation.AnnotationTarget.*

@Target(FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER)
annotation class DateRequired;

其次,我还发现您使用了一个返回ResourceInfo实例的Java平台类java.reflect.Method。它可能会返回null,导致Kotlin中的NullPointerException。在调用!!方法之前,您必须使用NPE-lovers operator getAnnotation

resourceInfo.resourceMethod!!.getAnnotation(DateRequired::class.java)
//                         ^--- force to call

最后,DynamicFeature是一个界面。在kotlin中实现一个接口,你必须删除括号()

@Provider
class DateRequiredFeature : DynamicFeature{...}

您可以查看有关注释here的更多详细信息。