【问题标题】:Determine Which Parameter in Constructor was used to Set a Specific Field in Class?确定构造函数中的哪个参数用于设置类中的特定字段?
【发布时间】:2020-03-03 17:12:29
【问题描述】:

我正在开发一个自定义 Java 对象持久性框架,正如我最近在 this question 中讨论的那样。

我要解决的一个问题是强制跨构造函数参数和类中的相应字段使用统一的注释值。

是否可以通过反射知道构造函数中的哪个参数用于设置类中的特定字段?例如,如果构造函数包含参数String textXYZ 并且类包含字段String textABC 并且在构造函数中我这样做:textABC = textXYZ(因此字段/参数具有不同的名称)。是否可以通过反射知道字段textABC 与构造函数参数textXYZ 相关联?

这将允许我只在字段上设置注释,然后推断参数的注释值,反之亦然..

谢谢

【问题讨论】:

  • 即使它们具有相同的名称,您也无法仅通过反射获得它。我的意思是你可以通过反射得到它,但你还需要注释构造函数参数或其他东西。
  • @Kayaman 如果它们具有相同的名称,我可以使用参数名称通过反射检索相应的字段,不是吗?我会注释字段并获取字段注释。
  • There’s a standard 用于将构造函数参数与属性关联...
  • @AlanCook 它通常不包括在内,因为参数名称是额外的元数据,在正常操作中被认为是不必要的。虽然现在这可能是一个几乎无关紧要的优化,但这并不是世界末日。例如,如果你看一下 Spring 的构造函数注入,它会尽可能执行基于类型的注入,否则它需要对参数进行额外的注释。与您的情况有些相似,但由于可用类型很少,您的情况恶化为立即需要注释。你已经为你的项目吃了很多东西。
  • @AlanCook 该标准要求您完全 one 注释,即构造函数中的注释。 您的决定要求在每个字段添加注释。因此,您的方法需要大量注释。

标签: java reflection parameters constructor annotations


【解决方案1】:

从 Java 7 开始,就有一个专门用于此目的的注解:ConstructorParameters。当放置在构造函数上时,它显示该构造函数的参数如何对应于构造对象的 getter 方法。您可以反思性地检查此注释,然后推断出哪些字段是相关的。 当然,没有人会强制对构造函数进行注释,但这是关联字段和 ctor 参数的唯一标准方法。许多工具,如 Jackson、Jsonb 等,都有自己的注释用于相同的目的。

【讨论】:

    猜你喜欢
    • 2012-07-03
    • 1970-01-01
    • 2013-09-03
    • 2014-01-31
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    相关资源
    最近更新 更多