在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中的默认RetentionPolicy
是RUNTIME
。 FUNCTION
, PROPERTY_GETTER
和PROPERTY_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{...}
你可以在这里看到关于注释的更多细节。