如何检查类的注释是否属于特定类别?

4

我有一些被注释的类,如下所示:

@BaseProp(category = Property.CATEGORY1)
where Property is a class defined as  
 public enum Property{
CATEGORY1("category1"), CATTEGORY2("category2");

    public static Property getCategory(String value) {
        return Property
                .valueOf(Optional.ofNullable(value).orElseThrow(IllegalArgumentException::new).toUpperCase());
    }

它具有适当的getter、setter、构造函数和此方法getCategory()

我在多个包中的其他类被注释为

@Prop(category = Property.CATGORY1)

这些类是基于一个基类的扩展。

我想要创建两个对象数组来存储不同类型的扩展了BaseClass并用CATEGORY1和CATEGORY2注释过的类的对象:

  1. 扩展了BaseClass且CATEGORY1注释过的类
  2. 扩展了BaseClass且CATEGORY2注释过的类

也就是说,我需要识别这些类并创建它们的对象,并将它们放入一个通用的Objectx数组中。

如何使用Java反射完成此操作?


你正在问错问题。如果你有一个Class,检查注解及其类别是微不足道的。但首先,你必须找出如何找到所有基类的子类。然后,动态创建实例又是另一个话题。但找到子类是最难的部分。 - Holger
1个回答

3

对于任何类(例如 Class X 扩展了 BaseClass),请使用以下内容:

Class<?> c = X.class;  // or if you have X x, then x.getClass();
for (Annotation ann : c.getAnnotations()) {
  if (ann instanceof BaseProp) {   // make sure it's your annotation
    BaseProp bp = (BaseProp)ann;
    bp.category();  // do something here
  }
}

你需要将决策逻辑放在“// do something here”这一行中,通过在那里检查实际属性值并根据情况将类分配到列表中来实现。

谢谢,我该如何为这个类创建一个对象? - Sriram Manohar
没有必要遍历所有的注解。你可以简单地说BaseProp bp = c.getAnnotation(BaseProp.class); if(bp!=null) {/* do something with */bp.category(); } - Holger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接