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

在Kotlin中,根据属性的类型限制注释目标

伯彦君
2023-03-14

在静态编程语言中,与Java一样,我们可以通过@Target元注释(例如。@Target(AnnotationTarget)将注释限制为仅用于特定类型的元素。VALUE_PARAMETER)所以注释只能应用于值参数)。

我的用例是,我想使用反射来验证属性(例如。@MustNotBeAir name: String),我想根据属性的类型限制注释的种类(例如。@MustBe正数: Int只能是应用于Int属性)。也欢迎对基于反射的验证的可行性进行评论。

是否有任何方法可以在编译时实现这一点,或者我需要在运行时检查这一点?

共有1个答案

陆寒
2023-03-14

kotlin.annotation.AnnotationTarget具有广泛的允许值,并且可以非常细粒度地限制注释的放置(例如'只在getter上'),但它是一个封闭的枚举。没有采用任何类型参数的注释注释。

您所能做的就是编写一个编译器插件,在编译时手动执行这些检查。

 类似资料:
  • 我使用com.google.gson.annotations.SerializedName,其中包含gson docs中提到的元素"value"和"备用",但编译器表示错误:"属性备用未定义注释类型SeriazedName"。

  • 我有一个kotlin类,它的属性有一个Java的注释,但是我不能用Java反射访问这些注释: 以下测试打印为空: 如何获取给定kotlin属性的注释?

  • 例如,我有一个Fruit和vitamin类的本体论。水果类只有橘子和香蕉为亚类,维生素类只有维他命C和维他命B为亚类。这些子类都是互不相交的。 我还提供了一个object属性,类Fruit作为域,类Vitamin作为范围。 然后,我定义了限制条件:“橘子提供一些维他命C”和“香蕉提供一些维他命B”。

  • 在我们项目的一个公共库中,我需要根据使用它的服务来区分一个接口的两个实现。 我通过构造函数注入来注入这个接口,并且需要找出如何根据我们的application.yml中的属性值来确定使用什么实现。 我查看了@Qualifier注释,但它似乎确实需要xml模式中的一个属性。我们没有这样的东西。 在我们代码的一部分中,我们以这种方式读出KafkaListener的属性 我可以在Spring中使用相同的

  • 假设我有一个JPA实体,比如 现在,我知道对于联接表中的每一个条目,这些属性都不能为空。(事实上,数据库强制执行此操作。) 好吧,让我们使用建议的解决方案,并转换为使用委托。 这仍然不能编译,因为 此批注不适用于目标“带有委托的成员属性” 我如何解决这个问题?

  • 我正在尝试获取一些类属性的类型,以便强烈键入我的静态编程语言代码。在打字稿中,我们可以这样做(愚蠢的例子,但这是为了解释) 这样做的好处是,如果我需要更改“_prop”的类型,不需要重构整个代码,因为类型是通过< code>Test["_prop"]找到的。在科特林有办法做到这一点吗? 我在Kotlin中见过反射函数,但无法得到我想要的 科特林代码: