我有一个用Java编写的框架,使用反射,获取注解上的字段并根据它们做出一些决定。在某些时候,我还可以创建注解的ad-hoc示例并自己设置字段。这部分看起来像这样:
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
}
}
但是编译器会抱怨:无法示例化注解类
所以问题是:我应该如何在Kotlin中做到这一点?
3条答案
按热度按时间h79rfbju1#
你可以使用Kotlinreflection:
在annotation有无参数构造函数的情况下(例如,每个annotation字段都有一个默认值),您可以使用以下方法:
8zzbczxx2#
这是我可能已经找到的解决方案,但对我来说感觉像是一个黑客,我更希望能够在语言中解决它。无论如何,值得的是,它是这样的:
tpgth1q73#
从Kotlin1.6开始,这应该是可能的(参见KEEP)
问题KT-45395
例如:
但是,如果您不幸处于较低的语言级别,则需要使用反射方法,如answered by Клаус Шварц。
那么反射调用(例如
Metadata::class.constructors.first().call(...)
)将失败,返回一个java.lang.NoSuchMethodException: kotlin.Metadata.kind()
,那么您需要使用代理方式(Proxy.newProxyInstance
)作为answered by Claudiu Dumitrescu,/claudiu-dumitrescu),并且您可能还需要处理注解声明的默认值