gpt4 book ai didi

java - 从 KType 中检索注释

转载 作者:行者123 更新时间:2023-11-30 07:48:41 25 4
gpt4 key购买 nike

我有一个简单的 TYPE_USE 注释:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
public @interface Cool {
}

以及以下示例 Kotlin 类:

class Item(
id: Long? = null,
var names: List<@Cool String> = emptyList())

有什么方法可以使用Java反射提取注解吗?

Item.class.getMethod("getName").getAnnotatedReturnType() 丢失注解,与获取字段相同。

我什至可以从 Kotlin 获取注解吗?

Item::class.memberProperties.elementAt(0).returnType 返回一个具有注释的 KType,但我看不到提取它的方法。也不会从 KType 获取 AnnotatedType,即使我有 JDK8 扩展。

我只看到了 KType#javaType 但它返回的是 Type,而不是 AnnotatedType...所以它再次丢失了注释。

最佳答案

<罢工>编辑:this is a bug and has been reported 。尚无目标版本,但其优先级已设置为 Major。 这已在 Kotlin 1.3 中修复。


<罢工>TL; DR:没有……?


注释为@Cool的项目是第一个类型参数,因此您需要检索它:

val type = Item::class.memberProperties.elementAt(0).returnType

val arg = type.arguments[0]
println(arg) // KTypeProjection(variance=INVARIANT, type=@Cool kotlin.String)

不幸的是,似乎没有办法检索 KType 上的注释(正如您所提到的)。

奇怪的是,这是一个非常内部的过程。查看 KTypeImpl 的来源表明 toString通过 ReflectionObjectRenderer.renderType(type) 实现, (其中类型是 KotlinType )委托(delegate)给 DescriptorRenderer.FQ_NAMES_IN_TYPES ,我们可以看到是a DescriptorRenderer with modifiers ALL .

渲染器检查类型是否是 kotlin.reflect.jvm.internal.impl.descriptors.annotations.Annotated 的子类, 然后访问它的 annotations属性(property)。

我试过这个:

val retType = Item::class.memberProperties.elementAt(0).returnType

val arg = retType.arguments[0]
println(arg) // KTypeProjection(variance=INVARIANT, type=@Cool kotlin.String)

val type = arg.type!!
println(type)

val field = type::class.memberProperties.first { it.name == "type" }
val kotlinType = field.call(type) as Annotated
println(kotlinType)

println(kotlinType.annotations)

不幸的是,我得到一个 ClassNotFoundException对于 org.jetbrains.kotlin.types.KotlinType ,所以那个选项消失了。

同样奇怪的是,KType不是 KAnnotatedElement 的子类型(这就是为什么它没有 annotations 属性)。

我想这可能是一个疏忽,因为 KTypeImpl包装 KotlinType ,其中确实包含注释。

关于java - 从 KType 中检索注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48948311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com