注解 Annotation
1.注解分类
1.1、源码
注解:只在源码中存在,编译时不存在。
1.2、编译时
注解:注解在源码和.class
编译时都存在。
1.3、运行时
注解:在运行阶段存在起作用。
2.元注解:给注解进行注解
2.1、@Target: 作用域,即注解可在什么地方使用
- package:包声明
- type:类、接口声明
- constructor:构造方法声明
- method:方法声明
- field:字段声明
- parameter:参数声明
- local_variable:局部变量声明
2.2、@Retention:生命周期,即注解在什么时候还有用
- source:只在源码显示,编译时会丢弃。用
@Retention(RetentionPolicy.SOURCE)
修饰的注解,表示注解的信息会被编译器抛弃,不会留在class
文件中,注解的信息只会留在源文件中。如@Override
、@Test
。 - class:编译时会记录到
class
中,运行时忽略。用@Retention(RetentionPolicy.CLASS)
修饰的注解,表示注解的信息在程序编译时被保留在class
文件(字节码文件)中,但不会被虚拟机读取在运行的时候。 - runtime:运行时存在,可以通过反射读取。用
@Retention(RetentionPolicy.RUNTIME)
修饰的注解,表示注解的信息被保留在class
文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时,所以可以用反射的方式读取。如@Controller
。2.3、Inherited:标识注解(允许子类继承父类的 被该注解标注的注解)
2.4、Documented:被该注解标注的注解 将被包含在Javadoc中(文档注释)
3.内置注解
3.1、@Override:重写。
3.2、@Deprecated:用于修饰已经过时的方法,即不推荐使用。
3.3、@SuppressWarings(“deprecation”):用于通知java编译器忽略特定的编译警告(镇压警告)。
4.自定义注解
4.1、注解格式
- 注解里的每个方法,实际是声明注解中的一个参数。方法的返回值类型就是注解的参数类型:类型只能是
基本数据类型
、String
、Class
、Annotation
、Enumeration
。 - 用
default
声明参数默认值。 - 注解类可以没有成员,没有成员的注解成为标识注解。
- 若注解只有一个参数,一般命名为
value
,调用时value
可省略。
1 | // 注解格式:public @interface 注解名 {定义内容} |
4.2、调用
1 | public class Test { |
4.2、反射获取 方法上
指定注解,并执行被注解标注的方法
1 |
|
4.3、反射获取 类上
指定注解
public void test2() throws ClassNotFoundException {
Class clazz = Class.forName("com.liu.demo.Test");
Annotation anno = clazz.getAnnotation(MyAnnotation.Class);
if (anno != null) {
System.out.println("该方法含有 MyAnnotation注解");
}
}