无法从方法获取@override注释

时间:2015-05-14 07:13:28

标签: java annotations

当我从class实例获取方法时,想要获得@override注释。 但是方法没有任何注释。 是否无法获得@override注释?

代码如下。

package com.test;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

import javax.annotation.Resource;

public class ReflectionTest {

    public static void main(String[] args) throws Exception {
        ChildHoge childHoge = new ChildHoge();
        Method method = childHoge.getClass().getMethod("init");
        for (Annotation s : method.getAnnotations()) {
            System.out.println(s);
        }
        Method method2 = childHoge.getClass().getMethod("a");
        for (Annotation a : method2.getAnnotations()) {
            System.out.println(a); // =>@javax.annotation.Resource(mappedName=, shareable=true, type=class java.lang.Object, authenticationType=CONTAINER, lookup=, description=, name=)

        }
    }

}

class SuperHoge {
    public void init() {

    }
}


class ChildHoge extends SuperHoge {
    @Override
    public void init() {
        super.init();
    }
    @Resource
    public void a() {

    }
}

2 个答案:

答案 0 :(得分:4)

@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

它有RetentionPolicy.SOURCE被编译器丢弃,这意味着它无法在运行时获得。您可以在JLS 9.6.4.2

中看到这一点
  

如果注释a对应于类型T,则T具有   (meta-)注释m对应于   java.lang.annotation.Retention,然后:

     
      
  • 如果m的元素值为   java.lang.annotation.RetentionPolicy.SOURCE,那么Java编译器必须   确保a不存在于类的二进制表示中   或出现a的界面。
  •   

RetentionPolicy的Javadoc也描述了这个:

public enum RetentionPolicy {
    /**
     * Annotations are to be discarded by the compiler.
     */
    SOURCE,
    ...

答案 1 :(得分:2)

您可以使用Reflection API检查方法是否被覆盖 e.g。

class.getMethod("myMethod").getDeclaringClass();

如果返回的班级是您自己的班级,那么它不会被覆盖;如果它是别的东西,该子类已经覆盖了它。