Java标准注解
@Override : 检测被注解的方法是否是是继承父类(接口)的
@Deprecated : 该注解的内容,表示已过时
@SuppressWarnings :关闭不当的编译器警告信息 压制警告
自定义注解
格式
元注解
public @interface 注解名称{
属性列表
}
本质:注解本质就是一个接口,该接口默认继承Annotation接口
属性:接口中可以调用的成员方法
要求:
- 返回值类型
基本数据类型
String
枚举
注解
以上类型的数组 - 定义了属性,在使用时要给属性赋值,不赋值的话可以在方法后加default 给属性 默认初始化值
如果只有一个属性需要赋值,并且属性名是value,则value可以省略,直接写值
数组赋值时,值用{}大括号包裹,如果数组中只有有个值时,{}可以省略
元注解
注解的注解
Java有四个元注解 @Retention
@Target
@Document
@Inherited;
1.@Retention: 描述注解保留的阶段
- @Retention(RetentionPolicy.RUNTIME):当前注解会保存到class字节码文件上,并被
jvm
读取到
2.@Target : 描述注解能够作用的位置
- @Target(ElementType.ANNOTATION_TYPE)
TYPE
:可以作用于类上METHOD
:可以作用于方法上FIELD
:可以作用于成员变量上
3.@Documented :描述注解是否被抽取到api
文档中
4.@Inherited: 表示子类可以继承
父类中的该注解(该注解是注解于父类)
注解修饰元素
RetentionPolicy:指的是注解的保留程度。
@Retention(RetentionPolicy.SOURCE)
注解仅存在于源码中,在class字节码文件中不包含@Retention(RetentionPolicy.CLASS)
默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得@Retention(RetentionPolicy.RUNTIME)
注解会在class字节码文件中存在,在运行时可以通过反射获
ElementType:指的是注解的作用目标。
@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)
包
获取注解值定义的属性值
- 获取注解定义位置的对象
- 获取指定的注解
getAnnotation(Class) - 调用注解中的抽象方法获取配置的属性值
注解pro
@Target(value= {ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface pro {
String className();
String methodName();
}
获取属性值
@pro(className = "测试.Demo1",methodName = "show")
public class Test {
public static void main(String [] args) {
//获取该类的字节码对象
Class<Test> testclass = Test.class;
//获取注解对象
pro an=testclass.getAnnotation(pro.class);//其实就是在内存中生成了一个该注解接口的子类对象
//调用注解对象中定义的抽象方法,获取返回值
String className =an.className();
String methodName =an.methodName();
System.out.println(className);
System.out.println(methodName);
}
}