如何通过反射访问 kotlin 中的类型使用注释?

How do I access type use annotations in kotlin through reflection?

A library 我正在使用利用类型使用注释来为变量添加约束。例如,如果您想要一个可配置的不透明度(以百分比表示,由 float 表示),您将注释 float 类型:

public @Setting.Constrain.Range(min = 0, max = 1, step = 0.1) float opacity = 1f;

我无法让相同的库处理相同的 kotlin 代码。

为了简化问题,我们自己声明注解和用法:

@Target(ElementType.TYPE_USE)
@Retention(RetentionPolicy.RUNTIME)
public @interface JavaAnnot { }
public class TestJava {

    @JavaAnnot int a = 5;

    public static void main(String[] args) {
        System.out.println(TestJava.class.getDeclaredFields()[0].getAnnotatedType().isAnnotationPresent(JavaAnnot.class));
    }

}

运行 TestJava#main 产生 true,表明类型上存在 JavaAnnot 注释。

如果我们引入一个新的 kotlin class TestKotlin 具有类似的 a 字段和注释类型:

class TestKotlin {

    val a: @JavaAnnot Int = 5

}

之前的检查,现在在TestKotlin class:

TestKotlin.class.getDeclaredField("a").getAnnotatedType().isAnnotationPresent(JavaAnnot.class)

产生 false,表明 JavaAnnot 注释不存在于 aInt 类型上,即使虽然我们清楚地做了注释。

我试过:

@Target(AnnotationTarget.TYPE)
@Retention(AnnotationRetention.RUNTIME)
annotation class KotlinAnnot
val a: @KotlinAnnot Int = 5

没有解决问题。

这是 kotlin 错误吗? kotlin 中不存在类型使用注释,还是语法不同?我做错了什么?

谢谢。

Kotlin 字段的 AnnotatedType 注释与 Kotlin 元数据注释一起存储,只能通过 Kotlin 反射访问。

更新:

自 Kotlin 1.4.0 起,编译器按预期编写类型注释。