Java反射派生类

时间:2012-08-07 09:54:54

标签: java reflection

这是我的场景“我有一个抽象类。有许多派生类使用注释扩展这个抽象类。此外,我有一个抽象类的方法,它反映了一个特定派生类中的所有符号”。

// Here's a definition of annotation
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SampleAnnotation {
   int sample();
}

public abstract class A { 

 // Here's a method to reflect all annotations
 // in particular derived class like B or C
 @Override
 public void foo() {

 }}

public class B extends A {
  @SampleAnnotation (sample = 1)
  public void step1() {}

  @SampleAnnotation (sample = 2)
  public void step2() {}

}

public class C extends A {
  @SampleAnnotation (sample = 1)
  public void step1() {}

  @Sample (stage = 2)
  public void step2() {}
}

如何使用java反射来反映特定派生类中的所有注释,如B或C?

2 个答案:

答案 0 :(得分:3)

或许你想到的是这个Reflections库。

  

使用思考可以查询元数据,例如:

     
      
  • 获取某种类型的所有子类型
  •   
  • 获取所有带注释的类型/方法/字段,没有匹配的注释参数
  •   
  • 获取与正则表达式匹配的所有资源
  •   

答案 1 :(得分:1)

取决于:

  1. 您是否希望获得具体类
  2. 的所有方法注释
  3. 您想获得所有具体类
  4. 的所有方法注释

    第一个可以使用foo的方法实现来实现:

    public void foo() {
         for (Method method : this.getClass().getDeclaredMethods()) {
              for (Annotation a : method.getAnnotations()) {
                  // do something with a
              }
         }
    }
    

    然后,您可以从具体类中调用foo,例如:

    new B().foo();

    对于第二种情况,您需要按 Peter Lawrey 指出的那样进行类路径扫描。