有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从KType中检索注释

我有一个简单的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()丢失注释,与获取字段相同

我能从科特林那里得到注释吗

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

我看到的只是KType#javaType,但它返回Type,而不是AnnotatedType。。。所以它又松开了注释


共 (1) 个答案

  1. # 1 楼答案

    编辑:this is a bug and has been reported。目前还没有一个目标版本,但其优先级已设置为MARGY这在Kotlin 1.3中已修复


    TL;医生:不


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

    val type = Item::class.memberProperties.elementAt(0).returnType
    
    val arg = type.arguments[0]
    println(arg) // KTypeProjection(variance=INVARIANT, type=@Cool kotlin.String)
    

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

    奇怪的是,这是一个非常内在的过程。查看^{}的源代码可以看出toString是通过ReflectionObjectRenderer.renderType(type)(其中类型是KotlinType)实现的,它被委托给DescriptorRenderer.FQ_NAMES_IN_TYPES,我们可以看到它是a ^{} with modifiers ^{}

    呈现程序检查该类型是否为kotlin.reflect.jvm.internal.impl.descriptors.annotations.Annotated的子类,然后访问其annotations属性

    我试过这个:

    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)
    

    不幸的是,我为org.jetbrains.kotlin.types.KotlinType得到了一个ClassNotFoundException,所以那个选项不见了

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

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