java - 强制使用统一的构造函数和方法注释值?

标签 java methods reflection constructor annotations

我正在使用 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 但我相信(如果我错了,请纠正我)我将无法再通过实例化类构造函数(我相信我需要通过反射直接设置每个字段的值来实例化类,从而绕过构造函数,对吗?)。但是,这并不理想,因为构造函数在实例化类之前执行某些必要的功能。

还有哪些其他解决方案?

谢谢!

最佳答案

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

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

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

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

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

关于java - 强制使用统一的构造函数和方法注释值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60501091/

相关文章:

Java反射

java class.getAnnotation(Class<?> class) 返回 null

java - 在 REPL 中使用队列文字时出现 RuntimeException

java - 是否可以在 Java 中#define 一个类?

java - 当我在 eclipse gwt 项目中运行我的代码时,无法为 JSP 错误编译类

java - 当没有值时,将值设置为空

java.lang.IncompatibleClassChangeError : Implementing class 错误

Javascript OOP特权方法以私有(private)参数作为输入访问私有(private)方法

javascript - Sequelize 模型自定义方法返回未定义

java - 自定义错误报告 : how to log down function arguments (and possibly locals) in an exception handler?