重学java 83.Java注解

As a failure,I met my last sound.

                                        —— 24.6.24

一、注解的介绍

1.引用数据类型:

        类、数组、接口、枚举、注解

jdk1.5版本的新特性

        一个引用数据类型

        和类,接口,枚举是同一个层次的

        引用数据类型:类、数组、接口、枚举、注解

2.作用:

        ① 说明:对代码进行说明,生成doc文档(API文档)

        ② 检查:检查代码是否符合条件     @override(重写)     @FunctionalInterface(函数式接口)

        ③ 分析:对代码进行分析,起到了代替配置文件的作用(会用)

3.JDK中的注解:

        @override ——> 检测此方法是否为重写方法
                jdk1.5版本,支持父类的方法重写
                jdk1.6版本,支持接口的方法重写

        @Deprecated ——>方法已经过时,不推荐使用

                调用方法的时候,方法上会有横线,但是能用

        @suppressWarnings ——> 消除警告        @suppressWarnings("all")

import java.util.ArrayList;
@SuppressWarnings("all")
public class Demo343Test01 {
    public static void main(String[] args) {
        Person person = new Person();
        person.eat();

        System.out.println("——————————————————————————");
        ArrayList list = new ArrayList();
        list.add(new Person());
    }
}
public class Person {
    @Deprecated
    public void eat(){
        System.out.println("人要吃饭");
    }
}

二、注解的定义以及属性的定义格式

注解属性:本质上是抽象方法

1.定义

public @interface 注解名{

}

2.定义属性(抽象方法)

增强注解的作用

数据类型 属性名() ——> 此属性没有默认值,需要在使用注解的时候为其赋值

数据类型 属性名()defaut值->此属性有默认值,如果有需要,还可以二次赋值

3.注解定义中的属性类型

        a、八种基本类型

        b、String类型,class类型,枚举类型,注解类型

        c、以及以上类型的一维数组

public @interface Book {
    // 书名
    String bookName();
    // 作者
    String[] author();
    // 价格
    int price();
    // 数量 default 默认值 10本
    int count() default 10;
}

三、注解的使用

1.注解的使用:

        为注解中的属性赋值

2.使用位置上:

        在类上使用,方法上使用,成员变量上使用,局部变量上使用,参数位置使用等

3.使用格式:

a、@注解名(属性名=值,属性名=值...)
b、如果属性中有数组:@注解名(属性名={元素1,元素2...})

@Book(bookName = "云边有个小卖部",author = "张嘉译",price = 10,count = 11)
public class BookShelf {
}

4.注解注意事项:

        ① 空注解可以直接使用 --> 空注解就是注解中没有任何的属性

        ② 不同的位置可以使用一样的注解,但是同样的位置不能使用一样的注解

        ③ 使用注解时,如果此注解中有属性,注解中的属性一定要赋值,如果有多个属性,用,隔开
如果注解中的属性有数组,使用{}

        ④ 如果注解中的属性值有默认值,那么我们不必要写,也不用重新赋值,反之必须写上

        ⑤ 如果注解中只有一个属性,并且属性名叫value,那么使用注解的时候,属性名不用写,直接写值(包括单个类型,还包括数组)

@Book(bookName = "云边有个小卖部",author = "张嘉译",price = 10,count = 11)
public class BookShelf {
}

四、注解的解析 ——> AnnotatedElement接口

注解的解析:说白了就是将注解中的属性值获取出来

1.注解解析涉及到的接口:

        AnnotatedElement接口

实现类:AccessibleObject、Class、Constructor、 Executable、 Field、 Method、 Package、Parameter

2.解析思路:

        先判断指定位置上有没有使用指定的注解,如果有,获取指定的注解,获取注解中的属性值

        a、boolean isAnnotationPresent(class<? extends Annotation> annotationClass) ——> 判断指定位置上有没有指定的注解

        比如:判断Bookshelf上有没有Book注解

        Class bookshelf=Bookshelf.classbookshelf.isAnnotationPresent(Book.class)
        b、getAnnotation(Class<T> annotationclass) ——> 获取指定的注解,返回值类型为获取的注解类型

        比如:获取Bookshelf上的Book注解
        Class bookshelf = Bookshelf.class

        boolean result = bookshelf.isAnnotationPresent(Book.class)

        如果resut为true,证明Bookshelf上有Book注解,那就获取

        Book book =bookshelf.getAnnotation(Book.class)

BOOK接口

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD, ElementType.PARAMETER,ElementType.LOCAL_VARIABLE,ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Book {
    // 书名
    String bookName();
    // 作者
    String[] author();
    // 价格
    int price();
    // 数量 default 默认值 10本
    int count() default 10;
}

书籍信息类        

@Book(bookName = "云边有个小卖部",author = "张嘉译",price = 27,count = 11525)
public class BookShelf {
}

 主函数

import java.util.Arrays;

public class Demo344Test {
    public static void main(String[] args) {
        // 1.获取BookShelf的class对象
        Class<BookShelf> bookShelfClass = BookShelf.class;
        // 2.判断bookShelf上有没有Book注解
        boolean b = bookShelfClass.isAnnotationPresent(Book.class);
        // 如果b为true,就获取
        if (b){
            Book book = bookShelfClass.getAnnotation(Book.class);
            System.out.println(book.bookName());
            System.out.println(Arrays.toString(book.author()));
            System.out.println(book.price());
            System.out.println(book.count());
        }
    }
}

以上代码没有解析出来

原因:Book注解有可能就没有在内存中出现

五、元注解

1.概述:

        元注解就是管理注解的注解

2.管理注解的方式:

        a、控制注解的使用位置

                ① 控制注解是否能在类上使用

                ② 控制注解是否能在方法上使用

                ③ 控制注解是否能在构造上使用等

        b、控制注解的加载位置(生命周期)

                ① 控制注解是否能在源码中出现

                ② 控制注解是否能在class文件中出现控制

                ③ 注解是否能在内存中出现

3.使用

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

        属性:ElementType[] value();

                ElementType是一个枚举,里面的成员可以类名直接调用

        ElementType中的成员:

                TYPE:控制注解能使用在类上

                FIELD:控制注解能使用在属性上

                METHOD:控制注解能使用在方法上

                PARAMETER:控制注解能使用在参数上

                CONSTRUCTOR:控制注解能使用在构造上

                LOCAL_VARIABLE:控制注解能使用在局部变量上

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

        属性:RetentionPoicy value();

                RetentionPolicy是一个枚举,里面的成员可以类名直接调用

        RetentionPolicy中的成员:

                SOURCE:控制注解能在源码中出现 ——> 默认

                CLASS:控制注解能在class文件中出现

                RUNTIME:控制注解能在内存中出现

BOOK接口

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD, ElementType.PARAMETER,ElementType.LOCAL_VARIABLE,ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Book {
    // 书名
    String bookName();
    // 作者
    String[] author();
    // 价格
    int price();
    // 数量 default 默认值 10本
    int count() default 10;
}

书籍信息类        

@Book(bookName = "云边有个小卖部",author = "张嘉译",price = 27,count = 11525)
public class BookShelf {
}

主函数

import java.util.Arrays;

public class Demo344Test {
    public static void main(String[] args) {
        // 1.获取BookShelf的class对象
        Class<BookShelf> bookShelfClass = BookShelf.class;
        // 2.判断bookShelf上有没有Book注解
        boolean b = bookShelfClass.isAnnotationPresent(Book.class);
        // 如果b为true,就获取
        if (b){
            Book book = bookShelfClass.getAnnotation(Book.class);
            System.out.println(book.bookName());
            System.out.println(Arrays.toString(book.author()));
            System.out.println(book.price());
            System.out.println(book.count());
        }
    }
}

  • 21
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值