当前位置: 首页 > 知识库问答 >
问题:

如何通过反射存取类型在kotlin中使用注释?

陶朝明
2023-03-14

我使用的库使用类型使用注释向变量添加约束。例如,如果您想要一个可配置的不透明度(以百分比为单位,由浮点表示),您需要注释浮点类型:

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类TestKotlin,具有类似的a字段和注释类型:

class TestKotlin {

    val a: @JavaAnnot Int = 5

}

之前的检查,现在在TestKotlin类上:

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

产生false,指示JavaAnnot注释不存在于Int类型的a上,尽管我们显然对其进行了注释。

我尝试过:

  • @JvmField注释a。这并没有改变这种行为
  • 在kotlin中声明相同的批注:
@Target(AnnotationTarget.TYPE)
@Retention(AnnotationRetention.RUNTIME)
annotation class KotlinAnnot
val a: @KotlinAnnot Int = 5

没有解决问题。

  • 检查其他可通过反射访问的元数据:我没有发现任何有用的东西

这是科特林虫吗?kotlin中是否不存在类型使用注释,或者语法是否不同?我做错了什么?

谢谢

共有1个答案

车靖琪
2023-03-14

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

更新:

从Kotlin 1.4开始。0时,编译器按预期写入类型批注。

 类似资料:
  • 主要内容:理解反射的类型(Type)与种类(Kind)在 Go语言中通过调用 reflect.TypeOf 函数,我们可以从一个任何非接口类型的值创建一个 reflect.Type 值。reflect.Type 值表示着此非接口值的类型。通过此值,我们可以得到很多此非接口类型的信息。当然,我们也可以将一个接口值传递给一个 reflect.TypeOf 函数调用,但是此调用将返回一个表示着此接口值的动态类型的 reflect.Type 值。 实际上,r

  • 根据JSR308(Java类型注释),可以使用elementtype.type_use注释任何类型:

  • 我在用匕首2对付科特林。所有工作都很好,但是当我试图将SharedPreferences注入活动时,我的项目甚至不能创建。Gradle控制台说: di\appcomponent.java:6:error:[dagger.android.androidinjector.inject(T)]android.content.sharedpreferences不是nullable,而是由@org.jetb

  • 问题内容: 我需要知道如何在运行时阅读Javadoc注释(可能是通过反射吗?) 说我有以下功能: 在运行时,我可以通过反射获得有关此函数的更多信息。但是无法阅读注释。所以问题是,如何在运行时阅读此 javadoc 注释。 问题答案: 考虑使用注释而不是Javadoc并编写注释处理器。

  • 问题内容: 是否可以获取通用参数的类型? 一个例子: 问题答案: 我曾经偶然发现的一种结构看起来像 因此,似乎有些不可思议的想法使我感到遗憾,我很不了解…对不起。

  • 我知道如果我们知道注释类,我们可以很容易地获得特定的注释并访问其属性。例如: 它将返回特定注释接口的引用,因此您可以轻松访问其值。 我的问题是,我是否对特定的注释类没有预先了解。我只想在运行时使用反射来获取所有注释类名及其属性,以便将类信息转储为例如JSON文件。我怎样才能以简单的方式做到这一点。 此方法将仅返回注释接口的动态代理。