在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