一、是什么
在Java中,常用的四种Java文件类型:类,接口,注解,枚举。
1、注解是一种标记
可以将注解理解为对某一对象(类、方法、属性等,下面详细解释)的标记,通过这种标记可以在不同时期对该对象进行操作。简单来说注解就是一种标记,对于这种标记,有两种处理方式,静态解析、动态解析。和自定义标签类似,后面使用的概率不大。
二、定义注解时的一些约束(常用四个)
1、在定义注解时,有一些官方注解是用于修饰注解的
元注解
元注解用于修饰其他的注解
2、可以被注解标记的对象(这里的对象不是指Object对象)
在自定义注解时会在注解的上面加@Target注解,来规定他可以加在哪个位置,(好,那么问题就来了,@Target注解是由什么约束的?没错,就是他自己)
@Target(ElementType.TYPE) //接口、类
@Target(ElementType.FIELD) //属性
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE) //局部变量
@Target(ElementType.ANNOTATION_TYPE) //注解
@Target(ElementType.PACKAGE) //包
3、注解存在的时间
在定义注解时,通过@Retention注解来规定注解存在的时期
@Retention:定义注解的保留策略
@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS) //默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME) //注解会在class字节码文件中存在,在运行时可以通过反射获取到
另外在定义注解时还要加上的两个注解,一般在自定义的注解里,这四个注解就是基本的修饰
@Inherited:指定被修饰的Annotation将具有继承性
@Documented:指定被修饰的该Annotation可以被javadoc工具提取成文档.
4、注解分类
根据Annotation是否包含成员变量,可以把Annotation分为两类:
4.1 标记Annotation:
没有成员变量的Annotation; 这种Annotation仅利用自身的存在与否来提供信息,单纯的作为标记使用
4.2 元数据Annotation:
包含成员变量的Annotation; 它们可以接受(和提供)更多的元数据;
三、自定义注解开发
使用@interface关键字, 其定义过程与定义接口非常类似, 需要注意的是:
Annotation的成员变量在Annotation定义中是以无参的方法形式来声明的, 其方法名和返回值类型定义了该成员变量的名字和类型, 而且我们还可以使用default关键字为这个成员变量设定默认值
例如: