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自定义注解

posted @ 2020-05-09 16:49  草木物语  阅读(466)  评论(0编辑  收藏  举报