强制统一构造函数和方法注释值?

Force Uniform Constructor and Method Annotation Values?

我正在编写自定义 API 使用 Reflection 将对象保存到文件。我有以下 class 结构:

@Constructor
public XYZPOJO(@Key(key = "word") String word, @Key(key = "variations") ArrayList<String> varList) {
    this.word = word;
    this.varList = varList;
}


String word;
ArrayList<String> varList = new ArrayList<String>();


@Key(key = "word")
public String getWord() {
    return word;
}

@Key(key = "variations")
public ArrayList<String> getVarList() {
    return varList;
}

将对象保存到文件时,我的程序检索每个用 @Key 注释的方法,调用方法并使用 @Key 的值作为 属性 名称将调用的值保存到文件。稍后,当我想构造 Object 的实例时,它将搜索用 @Constructor 注释的构造函数,然后检索构造函数中每个参数的 @Key 的值,并从中检索键值 (属性)文件。

我的主要问题是,对于我想要保留的每个字段,我需要在每个方法之前和构造函数中的相应参数之前复制 @Key 注释(和值)。此外,如果两个 constructor/method 注释不完全匹配,它将无法实例化 Object。很容易不小心复制错误的值。

有没有办法只定义每个 @Key 一次?

我正在考虑在我希望坚持的每个字段之前添加一次 @Key 但是我相信(如果我错了请纠正我)我将不再能够实例化 class 通过构造函数(我相信我需要通过反射直接设置每个字段的值来实例化 class,从而绕过构造函数,对吗?)。然而,这并不理想,因为构造函数在实例化 class 之前执行某些必要的功能。

还有哪些其他解决方案?

谢谢!

您可以像所有其他库一样进行序列化(或者只是切换到这些库之一,因为它们都支持您所做的一切),因此可能的解决方案:

  1. 默认跳过注释,只使用 getter 的名称(如 getMoney -> money),仅在构造函数中使用注释。如果您想以序列化形式使用其他名称,则在 getter 上。此外,您还可以查找具有相同名称的字段来检查其上的注释,但它是可选的且不是必需的。

  2. 仅注释构造函数中的参数,但允许同时设置名称和 属性 名称(默认情况下,您可以假设名称 == 属性 除非有人提供了这两个值)和稍后您可以将其更改为 getter 方法名称,例如 money -> getMoney (只需添加 get 并将首字母大写)

  3. 应用第一个想法,但如果有人使用 -parameters 标志编译代码,也可以使用运行时可用的构造函数中的参数名称。然后你不需要任何注释,除非你想以序列化形式使用不同的名称,然后只需将注释添加到 field/getter.

注意: 典型的库只是扫描 public 方法来查找属性。因此,他们寻找以 getis 开头后跟大写字母、没有参数和一些 return 类型的方法。典型数据 class 看起来像那样。