Java关于注解的使用、如何自定义注解、如何通过元注解解析注解

注解的介绍

Java中总共有五大引用数据类型:类、数组、接口、枚举、注解。其中注解是在jdk1.5版本中加进来的特性,和类,接口,枚举是同一个层次的。

注解应用:

  1. 说明:一般用来对代码进行说明,方便生成doc文档(API文档)
  2. 检查:检查代码是否符合条件@Override(检查重写方法) @FunctionalInterface(检查函数式接口)
  3. 分析:对代码进行分析,起到了代替配置文件的作用。

JDK中的常用注解

@Override:检测此方法是否为重写方法,支持父类、接口的方法重写
@Deprecated:表明此方法已经过时,不推荐使用,如果调用过时的方法,方法上会有横线,但是能用。

public class Person {
    private String name;
    public Integer age;
    @Deprecated
    void test() {
        System.out.println("hhhhhhhh");
    }
}

在这里插入图片描述
@SuppressWarnings:用来消除警告 @SuppressWarnings(“all”) ,all表示消除所有警告。
例如不指定ArrayList的泛型会警告
在这里插入图片描述
加上@SuppressWarnings("all") 就不警告了。
在这里插入图片描述

自定义注解及属性的定义格式

注解属性,其实本质上是抽象方法。但是我们按照属性来理解容易理解,因为到时候使用注解的时候,需要用=为其赋值。
自定义注解:

  public @interface 注解名{
      XXXXXXX
  }

定义属性:增强注解的作用
数据类型 属性名():此属性没有默认值,需要在使用注解的时候为其赋值。
数据类型 属性名() default 值:此属性有默认值,如果有需要,还可以二次赋值。

注解中能定义8种基本类型:
String类型、class类型、枚举类型、注解类型、以及以上类型的一维数组。
在这里插入图片描述

public @interface Car {
    String carname();//品牌
    String[] carParts();//车零件
    int price();//价格
    int count() default 66;//数量
}

注解使用

注解可以在类上使用,方法上使用,成员变量上使用,局部变量上使用,参数位置使用等。
使用格式:
@注解名(属性名 = 值,属性名 = 值...)
属性中有数组的情况:
@注解名(属性名 = {元素1,元素2...})

数量count有默认值所以可以不用指定。
在这里插入图片描述

注解注意事项:

  1. 空注解可以直接使用,空注解就是注解中没有任何的属性
  2. 不同的位置可以使用一样的注解,但是同样的位置不能使用一样的注解
  3. 使用注解时,如果此注解中有属性,注解中的属性一定要赋值,如果有多个属性,用","隔开如果注解中的属性有数组,使用{ }
  4. 如果注解中的属性值有默认值,那么我们不必要写,也不用重新赋值,反之必须写上。
  5. 如果注解中只有一个属性,并且属性名叫value,那么使用注解的时候,属性名不用写,直接写值(包括单个类型,还包括数组)
public @interface Car {
    String value();
}    

在这里插入图片描述
想要解析注解我们需要先使用元注解来管理注解能否在内存中出现,所以我们先介绍元注解

元注解

元注解就是管理注解的注解,它能够

  1. 控制注解的使用位置:控制注解是否能在类上、方法上、构造上使用。
  2. 控制注解的生命周期(加载位置):控制注解是否能在源码中、是否能在class文件中、是否能在内存中出现

@Target:控制注解的使用位置

ElementType[] value();:ElementType是一个枚举,里面的成员可以类名直接调用。
ElementType中的成员包括:

  1. TYPE:控制注解能使用在类上
  2. FIELD:控制注解能使用在属性上
  3. METHOD:控制注解能使用在方法上
  4. PARAMETER:控制注解能使用在参数上
  5. CONSTRUCTOR:控制注解能使用在构造上
  6. LOCAL_VARIABLE:控制注解能使用在局部变量上

@Retention:控制注解的生命周期(加载位置)

RetentionPolicy value();:RetentionPolicy是一个枚举,里面的成员可以类名直接调用
RetentionPolicy中的成员包括:

  1. SOURCE:控制注解能在源码中出现(默认)
  2. CLASS:控制注解能在class文件中出现
  3. RUNTIME:控制注解能在内存中出现

注解的解析

注解的解析就是将注解中的属性值获取出来,涉及到的接口为AnnotatedElement接口
实现类:AccessibleObject、Class、Constructor、Executable、Field、Method、Package、Parameter。
解析过程:先判断指定位置上有没有使用指定的注解。如果有,获取指定的注解,获取注解中的属性值。
boolean isAnnotationPresent(Class<? extends Annotation> annotationClass):判断指定位置上有没有指定的注解
getAnnotation(Class<T> annotationClass):获取指定的注解,返回值类型为获取的注解类型

public class Main {
    public static void main(String[] args) throws Exception {
        //1.获取BookShelf的class对象
        Class<Factory> factoryClass = Factory.class;
        //2.判断bookShelf上有没有Book注解
        boolean b = factoryClass.isAnnotationPresent(Car.class);
        //3.判断,如果b为true,就获取
        if (b) {
            Car car = factoryClass.getAnnotation(Car.class);
            System.out.println("品牌 = " + car.carname());
            System.out.println(Arrays.toString(car.carParts()));
            System.out.println("价格 = " + car.price());
            System.out.println("数量 = " + car.count());
        }
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值