我正在使用 Reflection
编写自定义 API 将对象保存到文件。我有以下类结构:
@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 的值(属性)来自文件。
我的主要问题是,对于我想要保留的每个字段,我需要在每个方法之前以及构造函数中相应参数之前复制 @Key
注释(和值)。此外,如果构造函数/方法注释不完全匹配,它将无法实例化对象。很容易意外复制错误的值。
有没有办法只定义每个@Key
一次?
我正在考虑在我希望保留的每个字段之前添加一次 @Key
但我相信(如果我错了,请纠正我)我将无法再通过实例化类构造函数(我相信我需要通过反射直接设置每个字段的值来实例化类,从而绕过构造函数,对吗?)。但是,这并不理想,因为构造函数在实例化类之前执行某些必要的功能。
还有哪些其他解决方案?
谢谢!
最佳答案
您可以像其他所有序列化库一样这样做(或者只是切换到这些库之一,因为它们都支持您所做的一切),因此可能的解决方案:
默认跳过注释,仅使用 getter 名称(如
getMoney
->money
),并仅在构造函数中使用注释。如果您想以序列化形式使用其他名称,则在 getter 上。此外,您也可以查找具有相同名称的字段来检查其注释,但它是可选的,不是必需的。仅注释构造函数中的参数,但允许设置名称和属性名称(默认情况下,您可以假设名称==属性,除非有人提供这两个值),稍后您可以将其更改为 getter 方法名称,就像这样
money
->getMoney
(只需添加get
并将第一个字母大写)应用第一个想法,但如果有人使用
-parameters
标志编译代码,也可以使用运行时可用的构造函数中的参数名称。然后你不需要任何注释,除非你想以序列化形式使用不同的名称,然后只需将注释添加到仅字段/getter。
注意:
典型的库只是扫描公共(public)方法来查找属性。因此,他们寻找以 get
或 is
开头,后跟大写字母的方法,这些方法没有参数和一些返回类型。典型的数据类看起来像这样。
关于java - 强制使用统一的构造函数和方法注释值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60501091/