Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过反射访问kotlin中的类型使用注释?_Java_Kotlin_Reflection_Types_Annotations - Fatal编程技术网

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

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

A我正在使用类型使用注释向变量添加约束。例如,如果您想要一个可配置的不透明度(以百分比表示,由
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中是否不存在类型使用注释,或者语法是否不同?我做错了什么


谢谢。

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

更新:


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

您有相关的源代码吗?在本例中,您可以清楚地看到我正在通过反射访问类型use注释,但仅在Java类上成功。@086,注释实际上没有添加到字段的类型中,它存储在Kotlin元数据中,因此只能通过Kotlin反射访问。