我正在尝试在抽象父级的构造函数中获取子类的注释。
public abstract class Skill {
private String identifier;
public Skill(){
identifier = getClass().getAnnotation(SerializableAs.class).value();
}
...
}
孩子看起来像这样:
@SerializableAs("TestSkill")
public class TestSkill extends Skill { ... }
显然上面的代码返回一个NPE,因为getAnnotation为Skill返回null,但有没有办法从子节点获取注释?
由于SerializableAs如何参与系统的其他基本部分以及如何创建TestSkill的新实例(通过动态jar加载/反射),我想避免在构造函数中有一个参数。我还想验证SerializableAs与标识符完全相同。
有办法做到这一点吗?
由于
编辑:这是我使用的SerializeAs注释的链接: https://github.com/Bukkit/Bukkit/blob/master/src/main/java/org/bukkit/configuration/serialization/SerializableAs.java
编辑:发现它,我很愚蠢,它按预期工作。谢谢!答案 0 :(得分:3)
不要忘记使用
注释您的注释@Retention(RetentionPolicy.RUNTIME)
这将使其在运行时可用(通过反射)。
我还要确认
SerializableAs
与...完全相同 标识符。
您必须在运行时自行验证value()
返回的值。
请注意,代码中的任何内容都不会强制Skill
的实现具有注释。有人可以制作一个没有它的子类型。您应该考虑到这一点,并可能将您的逻辑移到其他地方或更改逻辑以进行null
检查。