文章目录
- 注解
- 注解的介绍
- 注解的定义以及属性的定义格式
- 注解的使用
- 注解解析的方法----AnnotatedElement接口(扩展)
- 元注解
- 注解之在此注解
注解
注解的介绍
1.jdk1.5版本的新特性 — 一个引用数据类型
和类,接口,枚举是同一个层次
引用数据类型:类 数组 接口 枚举 注解
2.作用:
说明:对代码进行说明,生成doc文档(API)文档
@author
@version
检查:检查代码是否符合条件 @Override @FunctionalInterface
分析:对代码进行分析,起到了代替配置文件的作用
3.JDK中的注解:
@Override — 检测此方法是否为重写方法
jdk1.5版本 支持父类的方法重写
jdk1.6版本,支持接口的方法重写
@Depercated ----- 方法已经过时,不推荐使用
调用方法的时候,方法上会有横线,但是能用
@SuppressWarnings ---- 消除警告 @SuppressWarnings(“all”)
配置方法
<servlet><servlet-name>servlet1</servlet-name><servlet-class>servlet的全限定名</servlet-class>
</servlet><servlet-mapping><servlet-name>servlet1</servlet-name><url-pattern>/abc</url-pattern>
</servlet-mapping>
注解方法```java
@WebServlet("/abc")
public class Servlet1{}
public class test01 {@SuppressWarnings("all")@Deprecatedpublic void study(){System.out.println("学习,学习");}public static void main(String[] args) {new test01().study();final ArrayList list = new ArrayList();list.add(1);list.add("li");list.add(true);}
}
注解的定义以及属性的定义格式
1.定义格式:
public @interface 注解名{
}
2.属性定义:—增强注解的作用
数据类型 属性名() — 没有默认值 — 后面要是使用注解必须赋值
数据类型 属性名 () ----- 默认值 ---- 有默认值的 —后面要是使用注解可以不赋值也可以重新赋值
数据类型[] 数组名()
3.注解中能定义什么类型的属性那?
a.八种基本类型(byte short int long float double char boolean)
b.String类型 class类型 枚举类型 注解类型
c.以上类型的一维数组
public class test02 {public @interface Book{String name();int price();String[] author();int count() default 10;}
}
注解的使用
1.使用注解:为注解中的属性赋值
2.使用位置:
类上 方法上 成员变量上 局部变量上 参数位置 构造上
3.使用:
@注解名(属性名 = 属性值,属性名 = 数组值,数组名 = {元素1,元素2})
注意 在创建注解时,虽然写的时interface 但是class类一定要选择annotation
public @interface Book {String name();int price();String[] author();int count() default 10;
}
使用
public class test02 {@Book(name = "追风筝的人", price = 30, author = {"阿富汗","胡塞尼"})public class BookShelf {}
}
注解注意事项
1.空注解可以直接使用 — 空注解就是注解中没有任何属性
2.不同的位置可以使用一样的注解,但是同样的位置不能使用一样的注解
3.使用注解时,如果此注解中有属性,注解中的属性一定要赋值,如果有多个属性,用逗号隔开,如果注解中的属性有数组 使用{}
4.如果注解中的属性值有默认值,那么我们不必要写,也不用重新赋值,反之必须写上
5.如果注解中只有一个属性,并且属性名为value,那么使用注解的时候,属性名不用写,直接写值(包括单个类型,还包括数组)
注解解析的方法----AnnotatedElement接口(扩展)
1.解析注解接口:AnnotatedElement
实现类:Class,Constructor,Field,Method
2.解析思路
a.获取class对象
b.判断类上或者方法是否有指定的注解
c.如果有指定的注解,我们就获取指定的注解
d.获取到了指定的注解,我们就可以获取注解中的属性值
3.AnnotatedElement接口中的方法
a.boolean isAnnotatetionPresent(Class<> extends Annotation> annotationClass)-----> 判断有没有指定的注解
annotationClass传递的是要获取的注解的class对象
比如:BookShelf上有没有Book注解
获取BookShelf的class对象 class class = BookShelf.class
判断是否有Book注解:class.isAnnotationPresent(Book.class)
b.T getAnnotation(Class annotationClass) ---- 获取指定注解
annotationClass:传递的是要获取的注解的class对象
比如:获取BookShelf的class对象:class class = BookShelf.class
判断是否有Book注解:class.isAnnotationPresent(Book.class)
如果有,获取Book注解 Book book = class.getAnnotaion(Book.class)
public class test02 {public static void main(String[] args) {//获取BookShelf的class对象final Class<Bookshelf> bookshelfClass = Bookshelf.class;//判断是否有Book注解final boolean annotation;annotation = bookshelfClass.isAnnotationPresent(Book.class);System.out.println(annotation);//如果有,获取注解、if (annotation){final Book annotation1 = bookshelfClass.getAnnotation(Book.class);System.out.println(annotation1.name());System.out.println(annotation1.price());System.out.println(Arrays.toString(annotation1.author()));}}
}
以上代码没有解析出来,原因是Book注解没有出现在内存中,如果Book注解出现在内存中,则会注解出来
元注解
1.概述: 控制注解的注解
2.作用:是控制自定义注解的
3.问题:从哪些方面控制那?
a.从使用位置方面控制 ---- 控制自定义注解是否能在类上使用,还是能在方法上使用,还是能在构造上使用
b.从注解的生命周期方面控制
控制自定义注解是否在源文件中出现
控制自定义注解是否能在class文件中出现
控制自定义注解是否能在内存中出现
@Target — 控制注解能在什么位置上使用
a.属性:ElementType是一个枚举
枚举类中的枚举成员是Static final的,我们可以类名直接调用
b.枚举成员:
TYPE:控制注解只能在类上使用
FLELD: 控制注解只能在成员变量上使用
METHOD: 控制注解只能在方法上使用
PARAMETER:控制注解只能在参数上使用
CONSTRUCTOR: 控制注解只能在构造上使用
LOCAL VARIABLE: 控制注解只能在局部变量上使用
@Retention — 控制注解的生命周期
a.属性:RetentionPolicy — 是一个枚举
枚举类中的枚举成员都是static final的,我们可以类名直接调用
b.枚举成员
SOURCE:控制注解能在源文件中出现
CLASS:控制注解能在class文件中出现
RUNTIME:控制注解能在内存中出现
注解之在此注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Book {String name();int price();String[] author();int count() default 10;
}
测试代码
public class test02 {public static void main(String[] args) {//获取BookShelf的class对象final Class<Bookshelf> bookshelfClass = Bookshelf.class;//判断是否有Book注解final boolean annotation;annotation = bookshelfClass.isAnnotationPresent(Book.class);System.out.println(annotation);//如果有,获取注解、if (annotation){final Book annotation1 = bookshelfClass.getAnnotation(Book.class);System.out.println(annotation1.name());System.out.println(annotation1.price());System.out.println(Arrays.toString(annotation1.author()));}}