自定义注解

jdk中常见的注解

  • @Override : 检测被该注解标注的方法是否是继承自父类接口的
  • @Deprecated : 该注解标注的内容标识已过时
  • @SuppressWarnings : 压制警告

自定义注解

格式

元注解
public @interface 注解名称 {}
注解本质上就是一个接口,该接口默认继承Annotation接口
    public interface MyAnno extends java.lang.annotation.Annotation {}

接口的属性

  • 接口中可以定义的成员方法
    • 返回值类型
      • 基本数据类型
      • String
      • 枚举
      • 注解
      • 以上类型的数组
    • 定义了属性,在使用时要给属性赋值
        1. 如果定义时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
        2. 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。
        3. 数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}省略。
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);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值