1.什么是注解?
1. jdk1.5之后出现的,不是注释。
2. 注释是程序员写的,程序员看注释帮助理解程序代码。 注解是给程序看的。描述程序如何运行的以及在什么阶段运行的。(源代码阶段,编译阶段,运行阶段)
3. 注解相当于一种标记,看见一个注解就知道要做什么事。在程序中使用反射来解释注解是干什么的。
4. 注解可以添加类,包,变量,方法等等上 (@Test给方法添加注解)
2.注解的作用?
2.1 编写文档。
2.2 代码分析(使用反射来解释注解)
2.3 编译检查(@Override)进行基本的编译检查。
3.常见的注解?
3.1 @Override 重写(父类与子类之间的关系) 额外:@Overload重载(体现的多态性)
3.2 @Deprecated 类或者方法已经过时
3.3 @SupperWarings 排除相关警告
4.注解的声明
声明的注解格式: 注解的关键字 @interface
@Retention
@Target
访问权限 @interface 注解名{
可以声明的类型有 基本类型,String,枚举类型,Class类型,
示例: public String name();
}
查看注解的本质: 首先反编译class文件 ,执行命令javap -c class文件
结果:
Compiled from "MyAnnotation.java"
public interface com.sky.anntotation.MyAnnotation extends java.lang.annotation.Annotation {
}
本质是一个接口,父类是Annotation.
备注:一个注解必须声明在什么阶段可用,以及可以用在什么地方。
5.注解的相关方法
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) 判断指定filed或者method或者类等等。。。上是否有指定的注解
public <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass) 获取指定filed或者method或者类等上的指定注解
public Annotation[] getAnnotations() :获取指定filed或者method或者类等上的所有注解
6.注解的分类(4个)
5.1@Retention该注解可以运行在那个阶段(值:SOURCE,CLASS,RUNTIME)
5.1.1 SOURCE:表示注解只在源代码阶段有用,在编译阶段之后直接抛弃。
5.1.2 CLASS:注解在class中可以用,但是在vm中被抛弃。
5.1.3 RUNTIME:在VM运行阶段保留注解。因此通过反射读取注解的信息。
5.2@Target表示该注解可以用在什么地方(构造方法,局部变量,方法,包,参数等等。。。。)
5.3 @Documented 将注解包含到doc中
执行命令(切换目录到指定类的位置): javadoc -d doc 类名.java (该类中使用了注解)
5.4 @Inerited 允许子类可以继承父类的注解
7.反射和注解的关系?
解释: 如果注解要具有一定意义的功能,必须使用反射来解析,给指定注解注入不同的功能。
1. 如果某一个注解具有赋值功能,肯定是反射获取到指定变量,调用了f.set(obj,value)去赋值。
2. 如果是某个方法具有一定功能,肯定是反射获取到指定方法,调用method.invoke(obj,obj)进行方法调用
1和2做法基本都是框架完成,已经封装好,所以咱们第三阶段使用注解直接用了
例如: @transactionManager 数据库框架阶段直接使用注解就完成了事务处理。
大公司框架都是自己封装的。小公司直接用大公司发布的开源的,复制粘帖。
7.tomcat中servlet,filter,listener三个使用注解如何完成?
servlet规范中2.5之前使用web.xml进行注册
servlet3.0之后直接使用注解自动注册,不需要web.xml
Serlvet注解注册:
方式一:@WebServlet("/aa") servlet一个映射地址
方式二:@WebServlet(name="ServletDemo01",urlPatterns={"/cc","/bb"}) servlet多个映射地址
Listener注解注册:@WebListener
Filter注解注册:@WebFilter("/*")
使用注解注册:
优点:开发效率高(代码少)
缺点:硬编码(修改困难)
使用web.xml注册:
优点:可配置,解耦合
缺点:不直观,效率低