在Kotlin中创建一个注释实例

我有一个用Java编写的框架,使用反射,获取注释上的字段,并根据它们做出一些决定。 在某些时候,我也可以创建一个注释的临时实例并自己设置字段。 这部分看起来像这样:

public @interface ThirdPartyAnnotation{ String foo(); } class MyApp{ ThirdPartyAnnotation getInstanceOfAnnotation(final String foo) { ThirdPartyAnnotation annotation = new ThirdPartyAnnotation() { @Override public String foo() { return foo; } }; return annotation; } } 

现在我正在努力做Kotlin的确切的事情。 请记住,注释位于第三方jar中。 无论如何,这里是我在Kotlin试试的:

 class MyApp{ fun getAnnotationInstance(fooString:String):ThirdPartyAnnotation{ return ThirdPartyAnnotation(){ override fun foo=fooString } } 

但编译器抱怨:Annotation类不能被实例化

所以问题是:我应该如何在Kotlin中做到这一点?

这是我可能找到的解决方案,但感觉像对我来说是一个黑客,我宁愿能够在语言内解决它。 无论如何,值得的是这样的:

 class MyApp { fun getInstanceOfAnnotation(foo: String): ThirdPartyAnnotation { val annotationListener = object : InvocationHandler { override fun invoke(proxy: Any?, method: Method?, args: Array<out Any>?): Any? { return when (method?.name) { "foo" -> foo else -> FindBy::class.java } } } return Proxy.newProxyInstance(ThirdPartyAnnotation::class.java.classLoader, arrayOf(ThirdPartyAnnotation::class.java), annotationListener) as ThirdPartyAnnotation } } 

有一个语法错误,这可能是问题。 在您的Kotlin代码的第四行中,您重写了foo方法。 所以可能你不想要一个ThirdPartyAnnotation类的实例,而是它的一个子类。

TL,DR:把object关键字放在那里:

 class MyApp { fun getAnnotationInstance(fooString: String): ThirdPartyAnnotation{ return object : ThirdPartyAnnotation { override fun foo() = fooString } } } 

在这里阅读更多: https : //kotlinlang.org/docs/reference/object-declarations.html