在Kotlin中实现Java注释

我正在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

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

 import kotlin.annotation.AnnotationTarget.* @Target(FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER) annotation class DateRequired; 

其次,我也发现你使用了一个Java平台类ResourceInfo ,它返回一个java.reflect.Method实例。 它可能返回null导致Kotlin中的NullPointerException 。 你必须使用NPE爱好者操作员 !! 在调用getAnnotation方法之前:

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

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

 @Provider class DateRequiredFeature : DynamicFeature{...} 

你可以在这里看到关于注释的更多细节。