@Inherited注解

1. @Inherited

作用:
是一个标识,用来修饰注解,如果一个类用上了@Inherited修饰的注解,那么其子类也会继承这个注解

注意:
接口用上个@Inherited修饰的注解,其实现类不会继承这个注解
父类的方法用了@Inherited修饰的注解,子类也不会继承这个注解
当用了@Inherited修饰的注解的@RetentionRetentionPolicy.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("------------------");
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42039228/article/details/131509059
今日推荐