【问题标题】:How to check if an annotation of a class is of a particular category?如何检查类的注释是否属于特定类别?
【发布时间】:2016-07-11 14:26:40
【问题描述】:

我有如下注释的类:

@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)

这些类扩展了一个基类。

我想为类创建两个 ArrayList 对象 - 1.扩展BaseClass和category注解为CATEGORY1 2.扩展BaseClass和category标注为CATEGORY2

从某种意义上说,我想识别类并为它们创建对象并将它们放在Objectx 的一般ArrayList 中。

如何使用反射和 Java 做到这一点?

【问题讨论】:

  • 你问错问题了。如果您有Class,则检查注释及其类别是微不足道的。但首先,您必须找出如何找到基类的所有子类。那么,如何动态创建实例是另一个话题。但是找到子类是最难的部分。

标签: java class reflection


【解决方案1】:

对于任何类(例如 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
  }
}

您需要通过检查那里的实际属性值然后将类分配到适当的列表中,将您的决策逻辑放在“// 在此处做某事”行中。

【讨论】:

  • 谢谢,如何为这个类创建一个对象?
  • 不需要遍历所有注解。你可以简单地说BaseProp bp = c.getAnnotation(BaseProp.class); if(bp!=null) {/* do something with */bp.category(); }
猜你喜欢
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多