自定义注解——基于springboot

 

1.自定义注解实现——判断接口是否需要验证MD5

@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)	
public @interface checkAnnotation {
	boolean check() default false;
	String privateKey() default "testforblog";
	/**
	 * md5方法加密
	 */
	String[] fields() default {};
}

2.常用参数定义

@Documented //表明这个注解应该被javadoc工作记录
@Target(ElementType.METHOD)//指定注解的使用位置
@Inherited //是一个标记注解,指定被标注的类型是被继承的
如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
@Retention(RetentionPolicy.RUNTIME) //指定注解保留多长时间

3.详解@Inherited

注解和普通类的区别是如果一个子类想获取到父类上的注解信息,那么必须在父类上使用的注解上面 加上@Inherited关键字 。

    @Target(ElementType.TYPE)  
    @Retention(RetentionPolicy.RUNTIME)  
    @Inherited  
    public @interface ATable {  
      
        public String name() default "";  
    }  
      
    @Target(ElementType.TYPE)  
    @Retention(RetentionPolicy.RUNTIME)  
    public @interface BTable {  
        public String name() default "";  
    }  
      
      
    @ATable  
    public class Super {  
        private int superx;  
        public int supery;  
        public Super() {  
        }  
        private int superX(){    
            return 0;    
        }    
        public int superY(){    
            return 0;    
        }    
          
    }  
      
      
    @BTable  
    public class Sub extends Super{  
        private int subx;  
        public int suby;  
        private Sub()  
        {    
        }    
        public Sub(int i){    
        }    
        private int subX(){    
            return 0;    
        }    
        public int subY(){    
            return 0;    
        }    
    }  
      
      
      
    public class TestMain {  
        public static void main(String[] args) {  
              
            Class<Sub> clazz = Sub.class;  
              
            System.out.println("============================Field===========================");    
            System.out.println(Arrays.toString(clazz.getFields()));  
            System.out.println(Arrays.toString(clazz.getDeclaredFields()));  //all + 自身    
            System.out.println("============================Method===========================");  
            System.out.println(Arrays.toString(clazz.getMethods()));   //public + 继承    
            //all + 自身    
            System.out.println(Arrays.toString(clazz.getDeclaredMethods()));  
            System.out.println("============================Constructor===========================");    
            System.out.println(Arrays.toString(clazz.getConstructors()));    
                    System.out.println(Arrays.toString(clazz.getDeclaredConstructors()));    
            System.out.println("============================AnnotatedElement===========================");    
            //注解DBTable2是否存在于元素上    
            System.out.println(clazz.isAnnotationPresent(BTable.class));    
            //如果存在该元素的指定类型的注释DBTable2,则返回这些注释,否则返回 null。    
            System.out.println(clazz.getAnnotation(BTable.class));    
            //继承    
            System.out.println(Arrays.toString(clazz.getAnnotations()));    
            System.out.println(Arrays.toString(clazz.getDeclaredAnnotations()));  自身    
        }  
    }  

(1)getFields()获得某个类的所有的公共(public)的字段,包括父类。

(2)getDeclaredFields()获得某个类的所有申明的字段,即包括public、private和proteced,但是不包括父类的申明字段。

(3)同样method和constructor的打印也是如此。

(4)clazz.getAnnotations()可以打印出当前类的注解和父类的注解
          clazz.getDeclaredAnnotations()只会打印出当前类的注解

运行结果:

    ============================Field===========================  
    [public int annotion.inherit.Sub.suby, public int annotion.inherit.Super.supery]  
    [private int annotion.inherit.Sub.subx, public int annotion.inherit.Sub.suby]  
    ============================Method===========================  
    [public int annotion.inherit.Sub.subY(), public int annotion.inherit.Super.superY(), public final void java.lang.Object.wait() throws java.lang.InterruptedException, public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException, public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException, public boolean java.lang.Object.equals(java.lang.Object), public java.lang.String java.lang.Object.toString(), public native int java.lang.Object.hashCode(), public final native java.lang.Class java.lang.Object.getClass(), public final native void java.lang.Object.notify(), public final native void java.lang.Object.notifyAll()]  
    [private int annotion.inherit.Sub.subX(), public int annotion.inherit.Sub.subY()]  
    ============================Constructor===========================  
    [public annotion.inherit.Sub(int)]  
    [private annotion.inherit.Sub(), public annotion.inherit.Sub(int)]  
    ============================AnnotatedElement===========================  
    true  
    @annotion.inherit.BTable(name=)  
    [@annotion.inherit.ATable(name=), @annotion.inherit.BTable(name=)]  
    [@annotion.inherit.BTable(name=)]  

(5)如果注解ATable把@Inherit去掉。那么后面四行的输出结果如下,证明如果一个子类想获取父类上的注解信息,比必须在父类的注解上使用Inherited关键字。

    true  
    @annotion.inherit.BTable(name=)  
    [@annotion.inherit.BTable(name=)]  
    [@annotion.inherit.BTable(name=)]  

https://latty.iteye.com/blog/2371766

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值