如何通过反射访问 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
注释不存在于 a
的 Int
类型上,即使虽然我们清楚地做了注释。
我试过:
- 用
@JvmField
注释 a
。这并没有改变行为。
- 在 kotlin 中声明相同的注释:
@Target(AnnotationTarget.TYPE)
@Retention(AnnotationRetention.RUNTIME)
annotation class KotlinAnnot
val a: @KotlinAnnot Int = 5
没有解决问题。
- 检查其他可通过反射访问的元数据:我没有发现任何有用的东西。
这是 kotlin 错误吗? kotlin 中不存在类型使用注释,还是语法不同?我做错了什么?
谢谢。
Kotlin 字段的 AnnotatedType 注释与 Kotlin 元数据注释一起存储,只能通过 Kotlin 反射访问。
更新:
自 Kotlin 1.4.0 起,编译器按预期编写类型注释。
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
注释不存在于 a
的 Int
类型上,即使虽然我们清楚地做了注释。
我试过:
- 用
@JvmField
注释a
。这并没有改变行为。 - 在 kotlin 中声明相同的注释:
@Target(AnnotationTarget.TYPE)
@Retention(AnnotationRetention.RUNTIME)
annotation class KotlinAnnot
val a: @KotlinAnnot Int = 5
没有解决问题。
- 检查其他可通过反射访问的元数据:我没有发现任何有用的东西。
这是 kotlin 错误吗? kotlin 中不存在类型使用注释,还是语法不同?我做错了什么?
谢谢。
Kotlin 字段的 AnnotatedType 注释与 Kotlin 元数据注释一起存储,只能通过 Kotlin 反射访问。
更新:
自 Kotlin 1.4.0 起,编译器按预期编写类型注释。