概念
首先注解不是注释
Java注解:Java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法。
1.java注解分类
按来源分:java自带注解、第三方注解、自定义注解按生命周期分:源码注解、编译时注解、运行时注解
自定义注解的结构:元注解(用来注解注解的)、@接口定义、无参无异常的成员方法的定义(成员类型受限:基本数据类型、String、枚举)
1.1按来源分
1.1.1JDK自带注解
@Override 表示当前方法覆盖了父类的方法@Deprecation 表示方法已经过时,方法上有横线,会有警告。
@Suppvisewarnings 表示关闭一些警告信息(通知java编译器忽略特定的编译警告)
例如@suppressWarings("deprecation") 用于通知java编译器忽略特定的编译警告。
@SuppressWarnings,其参数有:
deprecation,使用了过时的类或方法时的警告
unchecked,执行了未检查的转换时的警告
fallthrough,当 Switch 程序块直接通往下一种情况而没有 Break 时的警告
path,在类路径、源文件路径等中有不存在的路径时的警告
serial,当在可序列化的类上缺少 serialVersionUID 定义时的警告
finally ,任何 finally 子句不能正常完成时的警告
all,关于以上所有情况的警告
1.1.2第三方注解
spring @Autowired @Service @Repository
mybatis @Insertprovider @UpdateProvider @Options
1.2按运行机制分
源码注解:注解只在源码中存在,编译成.class文件就不存在。
编译时注解:在源码和.class文件都存在。(如:JDK内置系统注解 @Override)
运行时注解:在运行时还起作用,甚至会影响运行逻辑。如@Autowired
2使用@interface关键字定义注解:
(1)成员以无参数无异常的的方式声明
(2)可以用default为成员制定一个默认值
(3)成员类型是受限制的,合法的类型包含原始基本类型及String、Class、Annotation、Enumeration
(4)如果注解只有一个成员,则成员名必须取为value();在使用时可以忽略成员名和赋值号(=)
(5)注解类可以没有成员,没有成员的注解成为标识注解
(1)成员以无参数无异常的的方式声明(2)可以用default为成员制定一个默认值
(3)成员类型是受限制的,合法的类型包含原始基本类型及String、Class、Annotation、Enumeration
(4)如果注解只有一个成员,则成员名必须取为value();在使用时可以忽略成员名和赋值号(=)
(5)注解类可以没有成员,没有成员的注解成为标识注解
2.1使用自定义注解
注意作用域@Target定义在类和接口上
3自定义注解的元注解:
1,@Target---作用域(constructor(构造方法声明),field(字段声明),local_variable(局部变量声明),method(方法声明),package(包声明),parameter(参数声明),type(类,接口声明))2,@Retention---生命周期(source:只在源码显示,编译时会丢弃。class:编译时会记录到class中,运行时忽略。runtime:运行时存在,可以通过反射读取)
用@Retention(RetentionPolicy.CLASS)修饰的注解,表示注解的信息被保留在class文件(字节码文件)中,但在程序运行时不会被虚拟机读取;
用@Retention(RetentionPolicy.SOURCE )修饰的注解,表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中;
用@Retention(RetentionPolicy.RUNTIME )修饰的注解,表示注解的信息被保留在class文件(字节码文件)中,当程序编译时,会被虚拟机保留,在运行时,用反射的方式读取。
3,Inherited---标识注解(允许子类继承(@Inherited 对接口interface继承没有作用,对类才有效))
4,Documented---生成Javadoc