Fork me on GitHub

注解

注意:所有文章除特别说明外,转载请注明出处.

自定义注解是程序中特殊的标记,用于替代配置文件。传统方式通过配置文件告诉类如何运行,有了注解技术之后,开发人员可以通过注解告诉类如何执行。在Java技术里应用注解的典型应用:通过反射技术去得到类里面的注解,从而决定如何去运行类。

提示:自定义使用场景,类属性自动赋值;验证对象属性完整性;代替配置文件功能,像Spring基于注解的配置;可以生成文档,像Java程序注释中的@see @param等。

@Target 元注解

@Target 元注解决定一个注解可以标识到哪些成分上。如:表示在类上或者属性上或者方法上 @Target 默认值为任何元素成分

自定义注解:

使用 @interface 自定义注解,自动继承 java.lang.annotation.Annotation 接口。

注意:在定义自定义注解时不能继承其他的注解或接口

@interface 用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只有基本类型、class、String、enum)

1.定义注解的格式

public @interface 注解名{定义体}

2.注解参数的可支持数据类型

1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)
2.String类型
3.Class类型
4.enum类型
5.Annotation类型
6.以上所有类型的数组

3.注解元素的默认值

注解元素需要有确定的值,要么在定义注解的默认值中指定,要么在使用注解时指定,同时不是基本类型的注解元素不能为null。所以在使用空字符串或 0 作为默认值是一种常用的方法。

4.注解@Retention 用来修饰注解,是注解的注解,称为元注解

@Retention 注解有一个属性 value 是RetentionPolicy类型的,Enum RetentionPolicy是一个枚举类型,这个枚举决定了Retention注解应该如何去保持,也可理解为Rentention 搭配 RententionPolicy使用。

@Retention(RetentionPolicy.CLASS)修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候

@Retention(RetentionPolicy.SOURCE )修饰的注解,表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中

@Retention(RetentionPolicy.RUNTIME )修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时

所以他们可以用反射方式来读取,RetentionPolicy.RUNTIME 可以让你从JVM中读取Annotation注解的信息,以便在分析程序的时候使用。

5.注解@Documented

@Documented 注解表明这个注解应该被 JavaDoc 工具记录。默认情况下,javadoc是不包括注解的,如果声明注解时指定了@Documented 则其会被javadoc之类的工具处理,所以注解类型信息会被包括在生成的文档中。

6.@Target 注解

@Target注解时为了说明Annotation所修饰的范围,Annotation可被用于 package、types(类、接口、枚举、Annotation类型)、类型成员、方法参数和本地变量

1.CONSTRUCTOR:用于描述构造器 

2.FIELD:用于描述域 

3.LOCAL_VARIABLE:用于描述局部变量

4.METHOD:用于描述方法

5.PACKAGE:用于描述包 

6.PARAMETER:用于描述参数

7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

7.案例

package annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 是否需要从解析Excel赋值
 * @author administrator
 * @see [相关类/方法]
 */
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = {ElementType.FIELD})
public @interface IsNeeded {
    boolean isNeeded() default true;
}

本文标题:注解

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月30日 - 08:19:01

原始链接:http://bangjinhu.github.io/undefined/自定义注解/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.