zoukankan      html  css  js  c++  java
  • java 自定义注解

    一、注解(Annotation)的简介:

            注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。

    二、注解的分类:

      1、一般常用的注解可以分为三类:

          一类是Java自带的标准注解,包括@Override(标明重写某个方法)、@Deprecated(标明某个类或方法过时)和@SuppressWarnings(标明要忽略的警告),使用这些注解后编译器就会进行检查。

          一类为元注解,元注解是用于定义注解的注解,包括@Retention(标明注解被保留的阶段)、@Target(标明注解使用的范围)、@Inherited(标明注解可继承)、@Documented(标明是否生成javadoc文档)

          一类为自定义注解,可以根据自己的需求定义注解

      

    2、注解基本元素解析(@RequiresPermissions 注解为例)  

    声明一个注解要用到的:

    ● 修饰符

      访问修饰符必须为public,不写默认为pubic;

    ● 关键字

      关键字为@interface;

    ● 注解名称

      注解名称为自定义注解的名称,使用时还会用到;

    ● 注解类型元素

      注解类型元素是注解中内容,可以理解成自定义接口的实现部分;

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target({ElementType.TYPE, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface RequiresPermissions {
        String[] value();
    
        Logical logical() default Logical.AND;
    }

    @Target

     表明该注解可以应用的java元素类型

    Target类型

    描述

    ElementType.TYPE

    应用于类、接口(包括注解类型)、枚举、或enum声明

    ElementType.FIELD

    应用于类中的成员变量(包括枚举中的常量)

    ElementType.METHOD

    应用于方法

    ElementType.PARAMETER

    应用于方法的形参

    ElementType.CONSTRUCTOR

    应用于构造函数

    ElementType.LOCAL_VARIABLE

    应用于局部变量

    ElementType.ANNOTATION_TYPE

    应用于注解类型

    ElementType.PACKAGE

    应用于包

    ElementType.TYPE_PARAMETER

    JDK1.8版本新增,应用于类型变量)

    ElementType.TYPE_USE

    JDK1.8版本新增,应用于任何使用类型的语句中(例如声明语句、泛型和强制转换语句中的类型)

    @Retention

           表明该注解的生命周期

    生命周期类型

    描述

    RetentionPolicy.SOURCE

    编译时被丢弃,不包含在类文件中(即源文件保留

    )

    RetentionPolicy.CLASS

    JVM加载时被丢弃,包含在类文件中,默认值(即class保留

    )

    RetentionPolicy.RUNTIME

    由JVM 加载,包含在类文件中,在运行时可以被获取到(即运行时保留

    )

    @Document

              表明该注解标记的元素可以被Javadoc 或类似的工具文档化

    @Inherited

              表明使用了@Inherited注解的注解,所标记的类的子类也会拥有这个注解

    三、自定义注解格式:

      public @interface 注解名 {定义体}

      注解参数的可支持数据类型:

          1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)

        2.String类型

        3.Class类型

        4.enum类型

        5.Annotation类型

        6.以上所有类型的数组

      Annotation类型里面的参数该怎么设定: 

      第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型;   

      第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和 String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String;  

      第三,如果只有一个参数成员,最好把参数名称设为"value",后加小括号.例:下面的例子FruitName注解就只有一个参数成员。

    3.1 自定义注解:@FileName

    import java.lang.annotation.*;
    
    @Target({ElementType.FIELD, ElementType.PARAMETER})//成员变量
    @Retention(RetentionPolicy.RUNTIME)//运行时
    @Documented
    public @interface FileName {
    
        String value() default "";
    
        String description();
    }

    测试类:

    @RunWith(SpringRunner.class)
    @SpringBootTest
    @Slf4j
    public class FileNameTest {
    
        @FieldName(value = "张三", description = "用户姓名")
        private String userName;
    
        @Test
        public void contextLoads() {
            log.info("hello test");
        }
    
        @Test
        public void testAnotation() {
            log.info("start ...");
            //获取测试类的模版
            Class nameClass = FileNameTest.class;
    
            //获取 所有的字段
            for (Field f : nameClass.getDeclaredFields()) {
                //判断此字段是否有FileName注解
                if (f.isAnnotationPresent(FieldName.class)) {
                    FieldName fAnnotation = f.getAnnotation(FieldName.class);
                    log.info("字段:[" + f.getName() + "], 值:[" + fAnnotation.value() + "], 描述:[" + fAnnotation.description() + "]");
                }
            }
        }
    
    }

    文章来源: 微信公众 -> IT专刊 -> Java自定义注解

  • 相关阅读:
    ajax_基础1
    省市数据库脚本TblArea.
    c#中怎么使用dos命
    Lambda表达式
    面试收录
    .Net牛逼程序猿要懂得
    Web.config 配置文件
    sql 查询所有数据库、表名、表字段总结
    Json在net与页面之间的传递
    『转』SAP统驭科目解释
  • 原文地址:https://www.cnblogs.com/ooo0/p/12858677.html
Copyright © 2011-2022 走看看