JavaSE学习笔记(十五)注解Annotation

1 注解

概述

  • Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制
  • Java 语言中的类、构造器、方法、成员变量、参数等都可以被注解进行标注

作用

  • 对Java中类、方法、成员变量做标记,然后进行特殊处理,至于到底做何种处理由业务需求来决定

2 自定义注解

// public @interface 注解名称{
// 	  public 属性类型 属性名() default 默认值;
// }
//定义注解
public @interface MyBook {
    String name();
    String[] authors();
    double price() default 19.9;
}
//使用注解
public class AnnotationDemo1 {

    @MyBook(name="《天龙八部》",authors = {"方佬肆", "方佬大"} , price = 199.5)
    private AnnotationDemo1(){
    }

    @MyBook(name="《神雕侠侣》",authors = {"方佬肆", "方佬贰"} , price = 199.5)
    public static void main(String[] args) {
        @MyBook(name="《神雕侠侣》",authors = {"张三", "李四"} , price = 199.5)
        int age = 21;
    }
}

特殊属性:

  • value属性,如果只有一个value属性的情况下,使用value属性的时候可以省略value名称>不写!!
  • 但是如果有多个属性, 且多个属性没有默认值,那么value名称是不能省略的

3 元注解

定义

  • 注解注解的注解(放在注解上的注解)

元注解有两个

  • @Target:约束自定义注解只能在哪些地方使用
  • @Retention:申明注解的生命周期

有些注解编译后就消失了

3.1 @Target

  • @Target中可使用的值定义在ElementType枚举类中,常用值如下:
    TYPE,类,接口
    FIELD, 成员变量
    METHOD, 成员方法
    PARAMETER, 方法参数
    CONSTRUCTOR, 构造器
    LOCAL_VARIABLE, 局部变量

3.2 @Retention

  • @Retention中可使用的值定义在RetentionPolicy枚举类中,常用值如下:
    SOURCE: 注解只作用在源码阶段,生成的字节码文件中不存在
    CLASS: 注解作用在源码阶段,字节码文件阶段,运行阶段不存在,默认值.
    RUNTIME:注解作用在源码阶段,字节码文件阶段,运行阶段(开发常用)
@Target({ElementType.METHOD,ElementType.FIELD}) // 元注解
@Retention(RetentionPolicy.RUNTIME) // 一直活着,在运行阶段这个注解也不消失
public @interface MyTest {
}

4 注解的解析

  • 注解的操作中经常需要进行解析,注解的解析就是判断是否存在注解,存在注解就解析出内容

与注解解析相关的接口

  • Annotation: 注解的顶级接口,注解都是Annotation类型的对象
  • AnnotatedElement:该接口定义了与注解解析相关的解析方法
方法说明
Annotation[] getDeclaredAnnotations()获得当前对象上使用的所有注解,返回注解数组
T getDeclaredAnnotation(Class< T> annotationClass)根据注解类型获得对应注解对象
boolean isAnnotationPresent(Class< Annotation> annotationClass)判断当前对象是否使用了指定的注解,如果使用了则返回true,否则false
@Test
public void parseClass(){
    // a.先得到类对象
    Class c = BookStore.class;
    // b.判断这个类上面是否存在这个注解
    if(c.isAnnotationPresent(Bookk.class)){
        //c.直接获取该注解对象
        Bookk book = (Bookk) c.getDeclaredAnnotation(Bookk.class); // 强转类型
        System.out.println(book.value());
        System.out.println(book.price());
        System.out.println(Arrays.toString(book.author()));
    }
}

@Test
public void parseMethod() throws NoSuchMethodException {
    // a.先得到类对象
    Class c = BookStore.class;

    Method m = c.getDeclaredMethod("test");

    // b.判断这个类上面是否存在这个注解
    if(m.isAnnotationPresent(Bookk.class)){
        //c.直接获取该注解对象
        Bookk book = (Bookk) m.getDeclaredAnnotation(Bookk.class);
        System.out.println(book.value());
        System.out.println(book.price());
        System.out.println(Arrays.toString(book.author()));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值