jdk中常见的注解
- @Override : 检测被该注解标注的方法是否是继承自父类接口的
- @Deprecated : 该注解标注的内容标识已过时
- @SuppressWarnings : 压制警告
自定义注解
格式
元注解
public @interface 注解名称 {}
注解本质上就是一个接口,该接口默认继承Annotation接口
public interface MyAnno extends java.lang.annotation.Annotation {}
接口的属性
- 接口中可以定义的成员方法
- 返回值类型
- 基本数据类型
- String
- 枚举
- 注解
- 以上类型的数组
- 定义了属性,在使用时要给属性赋值
-
- 如果定义时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
- 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。
- 数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}省略。
-
- 返回值类型
public @interface MyAnno {
int value() default 1;
String[] show2();
Addr show3();
Anno show4();
}
@MyAnno(value = 1, show3 = Addr.A1, show4 = @Anno, show2 = {"aaa", "bbb"})
public static void main(String[] args) {
}
元注解
用于描述注解的注解
@Target:描述注解能够作用的位置
TYPE:类
FIELD:字段
METHOD:方法
@Retention:描述注解被保留的阶段
@Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
@Retention(RetentionPolicy.CLASS):当前被描述的注解,会保留到class字节码文件中,不会被JVM读取到
@Retention(RetentionPolicy.SOURCE):当前被描述的注解,不会保留到class字节码文件中
@Documented:描述注解是否被抽取到API文档中
@Inherited:描述注解是否被子类继承
获取一个类的字节码文件的三种方式
- Class.forName()
- 对象.getClass()
- 类.class
@Pro(className = "annotation.announcement.Demo2", methodName = "show")
public class AnnoTest {
public static void main(String[] args) throws Exception {
// 1.解析注解
// 1.1 获取类的字节码文件对象
Class<?> clz = Class.forName("annotation.announcement.AnnoTest");
// 1.2 获取类注解对象
Pro annotation = clz.getAnnotation(Pro.class);
// 2. 调用注解中定义的抽象方法
String className = annotation.className();
String methodName = annotation.methodName();
System.out.println(className);
System.out.println(methodName);
// 加载该节进内存
Class aClass = Class.forName(className);
// 创建类对象
Object object = aClass.newInstance();
// 获取方法对象
Method method = aClass.getMethod(methodName);
// 执行方法
method.invoke(object);
}
}