一、注解的介绍
1、作用:
说明:对代码进行说明,生成doc文档
☆检查:检查代码是否符合条件 例:@Override
☆分析:对代码进行分析,起到了代替配置文件的作用
例web.xml中的配置文件:
二、注解的定义 以及属性的定义格式
1.定义:
public @interface 注解名{
}
2.定义属性:增强注解的作用
数据类型 属性名() -> 此属性没有默认值,需要在使用注解的时候为其赋值
数据类型 属性名() default 值 -> 此属性没有默认值,如果有需要,也可以二次赋值
3.注解中能定义什么数据类型?
a.8种基本类型
b.String类型,class类型,枚举类型,注解类型
c.以上类型的一维数组
public @interface Book {
//书名
String bookName();
//作者
String[] author();
//价格
double price();
//数量
int count() default 10;
}
三、注解的使用
1.注解的使用:
说白了就是为注解中的属性赋值
2.使用位置上:
在类上使用,方法上使用,成员变量上使用,局部变量上使用,参数位置使用等
3.使用格式:
a.@注解名(属性名 = 值,属性名 = 值...)
b.如果属性中有数组:
@注解名(属性名 = {元素1,元素2})
@Book(bookName = "金瓶梅",author = {"涛哥","金莲"},price = 9.9,count = 200)
public class BookShelf {
}
注解注意事项:
1.空注解可以直接使用->空注解就是注解中没有任何的属性
2.不同的位置可以使用一样的注解,但是同样的位置不能使用一样的注解
3.使用注解时,如果此注解中有属性,注解中的属性一定要赋值,如果有多个属性,用,隔开
如果注解中的属性有数组,使用{}
4.如果注解中的属性值有默认值,那么我们不必要写,也不用重新赋值,反之必须写上
5.如果注解中只有一个属性,并且属性名叫value,那么使用注解的时候,属性名不用写,直接写值
(包括单个类型,还包括数组)
四、注解的解析方法 -> AnnotatedElement接口
1.注解解析涉及的接口:
AnnotatedElement接口:
实现类:AccessibleObject, Class, Constructor, Field, Method
2.解析思路: 先判断指定位置上有没有使用指定的注解,如果有,获取指定的注解,获取注解中的属性值
a.boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)->判断指定位置上有没有指定的注解
比如:判断BookShelf上有没有Book注解
Class bookShelf = BookShelf.class
bookShelf.isAnnotationPresent(Book.class)
b.getAnnotation(Class<T> annotationClass)-> 获取指定的注解
比如:获取BookShelf上的Book注解
Class bookShelf = BookShelf.class
boolean result = bookShelf.isAnnotationPresent(Book.class)
Book book = bookShelf.getAnnotation(Book.class)
public class Test01 {
public static void main(String[] args) {
Class<BookShelf> bookShelfClass = BookShelf.class;
boolean b = bookShelfClass.isAnnotationPresent(Book.class);
//System.out.println(b);
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());
}
}
}
结果没有解析出来
五、元注解
1、概述:元注解是管理注解的注解
2、从哪些方面管理呢?
- 控制自定义注解的使用位置,是否能在:类、方法、成员变量中使用
- 控制自定义注解的生命周期(加载位置),是否能在:源码中、class文件中、内存中出现
3、怎么使用呢
a.@Target:控制自定义注解的使用位置
属性:ElementType[] value();
ElementType是一个枚举,里面的枚举类型可以类名直接调用
ElementType中的枚举:
TYPE:控制注解能使用在类上
FIELD:控制注解能使用在属性上
METHOD:控制注解能使用在方法上
PARAMETER:控制注解能使用在参数上
CONSTRUCTOR:控制注解能使用在构造上
LOCAL_VARIABLE:控制注解能使用在局部变量上
b.@Retention:控制自定义注解的生命周期(加载位置)
属性:RetentionPolicy value()
RetentionPolicy是一个枚举类,里面的枚举可以类名直接调用
RetentionPolicy中的枚举:
SOURCE:控制注解能在源码中出现 -> 默认
CLASS:控制注解能在class文件中出现
RUNTIME:控制注解能在内存中出现
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Book {
//书名
String bookName();
//作者
String[] author();
//价格
double price();
//数量
int count() default 10;
}
public class Test01 {
public static void main(String[] args) {
Class<BookShelf> bookShelfClass = BookShelf.class;
boolean b = bookShelfClass.isAnnotationPresent(Book.class);
//System.out.println(b);
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());
}
}
}
输出:
金瓶梅
[涛哥, 金莲]
9.9
200