zoukankan      html  css  js  c++  java
  • 理解Java注解类型

    一. 理解Java注解

    注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类。而我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象$Proxy1。通过代理对象调用自定义注解(接口)的方法,会最终调用AnnotationInvocationHandler的invoke方法。该方法会从memberValues这个Map中索引出对应的值。而memberValues的来源是Java常量池。
    实际上Java注解与普通修饰符(public、static、void等)的使用方式并没有多大区别,下面的例子是常见的注解

    public class AnnotationDemo {
       
       @Test
       public static void A(){
           System.out.println("Test.....");
       }
       @Deprecated
       @SuppressWarnings("uncheck")
       public static void B(){
     
       }
    }
    

    通过在方法上使用@Test注解后,在运行该方法时,测试框架会自动识别该方法并单独调用,@Test实际上是一种标记注解,起标记作用,运行时告诉测试框架该方法为测试方法。而对于@Deprecated和@SuppressWarnings(“uncheck”),则是Java本身内置的注解,在代码中,可以经常看见它们,但这并不是一件好事,毕竟当方法或是类上面有@Deprecated注解时,说明该方法或是类都已经过期不建议再用,@SuppressWarnings 则表示忽略指定警告,比如@SuppressWarnings(“uncheck”),这就是注解的最简单的使用方式,那么下面我们就来看看注解定义的基本语法


    二. 基本语法
    声明注解与元注解

    我们先来看看前面的Test注解是如何声明的:

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    @Documented
    public @interface OpenAPIMeta {
        /**
         * 字符参数长度(仅需要对字符串类型进行设置)。
         */
        String limit();
    
        /**
         * 参数示例值(很重要不要随意赋值,用于生成示例json)。
         */
        String demo();
    
        /**
         * 参数说明。
         */
        String remark();
    
        /**
         * 参数是否必填项(0为非必填 ;1为必填 )
         */
        int isRequired() default 0;
    
        /**
         * 是否有扩展参数说明
         */
        boolean hasExtend() default false;
    
        /**
         * 枚举对象完整类型限定名
         */
        String enumType() default "";
    }
    

    三. 注解支持的数据类型
    所有基本类型(int,float,boolean,byte,double,char,long,short)
    String
    Class (如:Class<?> 或 Class<T>)
    enum
    Annotation
    上述类型的数组

    四. 获取类级注解

    DomainEventHandlerMessageQueue dehmqAnnotation = null;
    Annotation[] annotations = obj.getClass().getAnnotations();
    for (Annotation x : annotations) {
    if (x.annotationType() == DomainEventHandlerMessageQueue.class) {
        dehmqAnnotation = x;
        break;
    } 
    

    五. 获取方法注解

    Field[] fields = obj.getClass().getDeclaredFields();
    for (Field field : fields) {
        OpenAPIMeta apiAnnotation = null;
        for (Annotation x : field.getDeclaredAnnotations()) {
            if (x.annotationType() == OpenAPIMeta.class) {
                apiAnnotation = (OpenAPIMeta) x;
                break;
            }
        }
    }
    

     

  • 相关阅读:
    [NOIP2006] 提高组 洛谷P1064 金明的预算方案
    [NOIP2006] 提高组 洛谷P1063 能量项链
    [NOIP2006] 提高组 洛谷P1065 作业调度方案
    [NOIP2005] 提高组 洛谷P1051 谁拿了最多奖学金
    [NOIP2005] 提高组 洛谷P1054 等价表达式
    [NOIP2005] 提高组 洛谷P1053 篝火晚会
    [NOIP2005] 普及组 循环
    Bzoj3622 已经没有什么好害怕的了
    [NOIP2006] 普及组
    Bzoj1008 [HNOI2008]越狱
  • 原文地址:https://www.cnblogs.com/mrhgw/p/10524548.html
Copyright © 2011-2022 走看看