本文旨在复习学习的知识点,整理成笔记。参考了java3y的Java知识点。注解就这么简单-java3y
在Servlet和Filter的开发过程中,为了方便配置web.xml文件,可以直接使用@WebServlet
和@WebFilter
来简化操作。
1 什么是注解
注解:Annotation
注解其实就是代码中的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相对应的处理。
- 注解它不是注释,注释是程序员写的,给程序员看的。
- 注解给程序看,用于描述程序如何运行及在什么阶段来运行。
- 注解在实际开发中,最大的功能是用于替换配置文件。
- 注解是jdk1.5的新特性
- 可以通过反射来让注解具有功能。
- 注解的格式: @xxxx
- 注解它的本质就是一个接口,这个接口需要继承 Annotation接口
2 为什么需要用到注解
在之前编写Servlet的过程中,我们需要对web.xml进行配置文件。
利用注解的功能之后,我们可以一句话在Servlet类中一句代码解决。
可以看到,这样就简化了操作,且表现更为直观。并且Servlet规范是推崇这种配置方式的
3 三个基本的注解
- @Override: 检查子类确实是覆盖/重写了父类的方法。
父类:
子类:
- @Deprecated: 说明注解的方法已经过时了。
- @SuppressWarnings({“unused”,“deprecation”}):抑制程序中的警告。unused警告的类型。{}数组。all抑制所有警告
- @SafeVarargs:java7“堆污染”警告
- @FunctionalInterface:用来指定该接口是函数式接口
4 如何声明注解
Step1:声明一个注解 @interface 注解名{}
Step2: 声明注解中的成员(以下为注解中的属性类型)
- 1.基本类型
- 2.String
- 3.枚举类型
- 4.注解类型
- 5.Class类型
- 6.以上类型的一维数组类型
Step3:注解使用
声明注解
使用注解
模拟Junit中的@Test(单元测试方法)
Step1:先写一个MyTest.java注解
@Retention(RetentionPolicy.RUNTIME) //该注解的生命周期保留到运行时
//@Target(ElementType.METHOD)//这个注解只能在方法上面用
//@Target(ElementType.FIELD)//这个注解只能在属性上面用
public @interface MyTest {
String name() default "gyf";
}
Step2:写一个测试类Demo.java
public class Demo {
// @MyAnnotation(age=12,name="gyf",values={"gz","sz"},clazz = String.class)
@MyTest(name = "zhansan")
public void test1(){
System.out.println("test1方法执行了。");
}
@MyTest()
public void test2(){
System.out.println("test2方法执行了。");
}
public void test3(){
System.out.println("test3方法执行了。");
}
}
Step3:写个TestRunner
/**
1. 注解的工作原理
2. 1.通过反射获取方法
3. 2.通过方法获取方法上面声明的注解对象
4. 3.通过注解对象可以获取注解声明的一些参数
5. 4.通过反射来调用方法
*/
public class TestRunner {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, InvocationTargetException {
//执行Demo里单元测试两个方法
//1.通过反射来获取方法
Method[] methods = Demo.class.getMethods();
for(Method m : methods){
if(m.getName().startsWith("test")){//只有以test开头的方法才是单元测试方法
//2.通过反射来获取方法上的注解
MyTest myTest = m.getAnnotation(MyTest.class);
System.out.println(m.getName() + "是否有MyTest注解:" + myTest);
if(myTest != null){
System.out.println("name=" + myTest.name());
//执行注解下面的方法
m.invoke(Demo.class.newInstance());
}
}
}
}
}
5 元注解
什么是元注解
只能用在注解上的注解叫做元注解。(即:用于修饰注解的注解)
-
自定义的注解的存活范围(生命周期):默认是CLASS。
-
@Retention:作用。改变自定义的注解的存活范围
RetentionPolicy:SOURCE、CLASS、RUNTIME -
@Target:作用。指定该注解能用在什么地方。
ElementType:TYPE、METHOD、FIELD、ANNOTATION_TYPE -
@Documented:作用,使用了@MyTest的注解的类,如果@MyTest注解上面有@Documented注解,那么使用了@MyTest的注解的类的API文档中会出现@MyTest的身影。
-
@Inherited:作用,说明该注解可以被继承下去。
6.Servlet3.0中的2个常用注解
WebServlet
@WebServlet("\Servlet")
@WevSErvlet(name="Servlet")
WebFilter
@WebFilter("/*)
@WebFilter(filterName="myFilter",urlPatterns="/*");
补充:
自定义注解的信息注入到方法中
利用反射技术
步骤:
- 反射出该类的方法
- 通过方法得到注解上具体的信息
- 将注解上的信息注入到方法上
- 注入对象到方法或成员变量上