Java 如何通过反射访问kotlin中的类型使用注释?
A我正在使用类型使用注释向变量添加约束。例如,如果您想要一个可配置的不透明度(以百分比表示,由Java 如何通过反射访问kotlin中的类型使用注释?,java,kotlin,reflection,types,annotations,Java,Kotlin,Reflection,Types,Annotations,A我正在使用类型使用注释向变量添加约束。例如,如果您想要一个可配置的不透明度(以百分比表示,由float表示),您需要注释float类型: public@Setting.constraint.Range(最小值=0,最大值=1,步长=0.1)浮点不透明度=1f; 我无法让同一个库处理相同的kotlin代码 为了简化问题,让我们自己声明注释和用法: @Target(ElementType.TYPE\u使用) @保留(RetentionPolicy.RUNTIME) public@interfac
float
表示),您需要注释float
类型:
public@Setting.constraint.Range(最小值=0,最大值=1,步长=0.1)浮点不透明度=1f;
我无法让同一个库处理相同的kotlin代码
为了简化问题,让我们自己声明注释和用法:
@Target(ElementType.TYPE\u使用)
@保留(RetentionPolicy.RUNTIME)
public@interface JavaAnnot{}
公共类TestJava{
@JavaAnnot int a=5;
公共静态void main(字符串[]args){
System.out.println(TestJava.class.getDeclaredFields()[0].getAnnotatedType().isAnnotationPresent(javaAnnott.class));
}
}
运行TestJava#main
会产生true
,表明类型上存在JavaAnnot
注释
如果我们引入一个新的kotlin类TestKotlin
,该类具有类似的a
字段和注释类型:
类TestKotlin{
val a:@JavaAnnot Int=5
}
上一个检查,现在在TestKotlin
类上:
TestKotlin.class.getDeclaredField("a").getAnnotatedType().isAnnotationPresent(JavaAnnot.class)
产生false
,表明JavaAnnot
注释不存在于a
的Int
类型上,即使我们清楚地对其进行了注释
我试过:
- 用
注释@JvmField
。这并没有改变这种行为a
- 在kotlin中声明相同的批注:
@Target(AnnotationTarget.TYPE)
@保留(AnnotationRetention.RUNTIME)
注释类KotlinAnnot
val a:@KotlinAnnot Int=5
没有解决问题
- 检查其他可通过反射访问的元数据:我没有发现任何有用的东西
谢谢。Kotlin字段的AnnotatedType注释与Kotlin元数据注释一起存储,只能通过Kotlin反射进行访问 更新:
自Kotlin 1.4.0以来,编译器按照预期编写类型注释。您有相关的源代码吗?在本例中,您可以清楚地看到我正在通过反射访问类型use注释,但仅在Java类上成功。@086,注释实际上没有添加到字段的类型中,它存储在Kotlin元数据中,因此只能通过Kotlin反射访问。