当我从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() {
}
}
答案 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();
如果返回的班级是您自己的班级,那么它不会被覆盖;如果它是别的东西,该子类已经覆盖了它。