1. @Inherited
作用:
是一个标识,用来修饰注解,如果一个类用上了@Inherited修饰
的注解,那么其子类也会继承这个注解
注意:
接口用上个@Inherited
修饰的注解,其实现类不会继承这个注解
父类的方法用了@Inherited修饰的注解,子类也不会继承这个注解
当用了@Inherited
修饰的注解的@Retention
是RetentionPolicy.RUNTIME
,则增强了继承性,在反射中可以获取得到
2. 代码演示
2.1 创建注解
AAnnotate
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface AAnnotate {
public String name() default "";
}
BAnnotate
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface BAnnotate {
public String name() default "";
}
2.2 创建父类子类
创建父类SuperClass
@AAnnotate
public class SuperClass {
private int SuperClassx;
public int SuperClassy;
public SuperClass() {
}
//私有
private int SuperClassX(){
return 0;
}
//公有
public int SuperClassY(){
return 0;
}
}
创建子类Subclass
@BAnnotate
public class Subclass extends SuperClass {
private int Subclassx;
public int Subclassy;
private Subclass() {
}
public Subclass(int i) {
}
//私有
private int SubclassX() {
return 0;
}
//公有
public int SubclassY() {
return 0;
}
}
2.3 测试
class TestMain {
public static void main(String[] args) {
Class<Subclass> clazz = Subclass.class;
System.out.println("============================AnnotatedElement===========================");
//获取自身和父亲的注解。如果@AAnnotate未加@Inherited修饰,则获取的只是自身的注解而无法获取父亲的注解。
System.out.println(Arrays.toString(clazz.getAnnotations()));
System.out.println("------------------");
}
}
3. 反射
以下是对反射的拓展,与本文无关
class TestMain {
public static void main(String[] args) {
Class<Subclass> clazz = Subclass.class;
System.out.println("============================Field===========================");
// 自身和父亲的公有字段
System.out.println(Arrays.toString(clazz.getFields()));
System.out.println("------------------");
//自身所有字段
System.out.println(Arrays.toString(clazz.getDeclaredFields()));
System.out.println("============================Method===========================");
//自身和父亲的公有方法
System.out.println(Arrays.toString(clazz.getMethods()));
System.out.println("------------------");
// 自身所有方法
System.out.println(Arrays.toString(clazz.getDeclaredMethods()));
System.out.println("============================Constructor===========================");
//自身公有的构造方法
System.out.println(Arrays.toString(clazz.getConstructors()));
System.out.println("------------------");
//自身的所有构造方法
System.out.println(Arrays.toString(clazz.getDeclaredConstructors()));
System.out.println("============================AnnotatedElement===========================");
//获取自身和父亲的注解
System.out.println(Arrays.toString(clazz.getAnnotations()));
System.out.println("------------------");
//只获取自身的注解
System.out.println(Arrays.toString(clazz.getDeclaredAnnotations()));
System.out.println("------------------");
}
}