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());
}
}
}