在构造函数中获取child的注释值

时间:2013-12-22 23:16:09

标签: java reflection annotations

我正在尝试在抽象父级的构造函数中获取子类的注释。

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

编辑:发现它,我很愚蠢,它按预期工作。谢谢!

1 个答案:

答案 0 :(得分:3)

不要忘记使用

注释您的注释
@Retention(RetentionPolicy.RUNTIME)

这将使其在运行时可用(通过反射)。

  

我还要确认SerializableAs与...完全相同   标识符。

您必须在运行时自行验证value()返回的值。


请注意,代码中的任何内容都不会强制Skill的实现具有注释。有人可以制作一个没有它的子类型。您应该考虑到这一点,并可能将您的逻辑移到其他地方或更改逻辑以进行null检查。