【问题标题】:Check if derived class have an annotation from super class检查派生类是否有来自超类的注解
【发布时间】:2012-12-13 11:14:06
【问题描述】:

我需要检查,形成超类,如果派生类有特定的注解:

public class SuperClass
{
  public boolean hasAnnotation()
  {
    //super_class_method_code
  }
}

@annotationToCheck
public class DerivedClass extends SuperClass
{
   //derived_class_code
}

Java 有可能吗?我知道如何用 C# 做,但在 Java 中我找不到任何解决方案...... :(

谢谢!!!

【问题讨论】:

标签: java oop inheritance annotations


【解决方案1】:

如果您的实例实际上是子类类型,这就像在超类型中定义方法以具有以下实现一样简单:

this.getClass().isAnnotationPresent(annotationToCheck.class);

由于this 是 DerivedClass 的一个实例,因此 getClass 返回 DerivedClass 并且检查有效。

注意 2:正如 @Pshemo 在 cmets 中提到的那样,这仅在注释使用 @Retention(RetentionPolicy.RUNTIME) 注释时才有效。

【讨论】:

  • +1 我将补充一点,这适用于 @Retention(RetentionPolicy.RUNTIME) 策略的注释。
  • 噢噢噢!!!!我忘记在注释中指定 @Retention( value = RetentionPolicy.RUNTIME ) 和 @Target( value = ElementType.TYPE) !!!谢谢 Hiery 和 Pshemo !!!
  • @Pshemo 很好的观察!感谢您添加。
  • 请随时使用此信息更新您的答案,或支持我的评论以使其更加可见(对于那些 - 像我一样一开始 - 想知道为什么它不适合他们的人:)跨度>
  • @HieryNomus 我从 OP 问题中的类声明中删除了 (),所以注释 1 现在毫无意义(抱歉;p)
【解决方案2】:

使用reflections 项目获取派生类的另一种方法。此反射项目具有依赖项(slf4j、log4j 和 javassist 等)。


注意:派生类只能在提到的包中。

import java.util.Set;

import org.reflections.Reflections;

public class Base {

    public Base() {
        Reflections reflections = new Reflections("com.sree.despacerivedclasskage");
        Set<Class<? extends Base>> classes = reflections
                .getSubTypesOf(Base.class);
        System.out.println(classes);
        for(Class clazz: classes){
            System.out.println(clazz.isAnnotationPresent(ToCheck.class));
        }

    }
public static void main(String[] args) {
    Base b = new Base();
}

}

【讨论】:

    猜你喜欢
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多