注解,反射,动态代理。基本框架都会用到的基本原理。
先看下注解:
什么是注解:
Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法,这是比较官方标准的定义。
通俗些就是java提供的一个能标记的能力。
最常见的用途,就是各种框架里,通过反射来获取指定程序元素的Annotion对象,然后判断Annotion对象类型或者Annotion里的元数据,来做对应的处理逻辑。
注解的分类:
- JDK内置系统注解
- 元注解
- 自定义注解
JDK内置系统的注解
- @Override:用于修饰此方法覆盖了父类的方法;
- @Deprecated:用于修饰已经过时的方法;
- @SuppressWarnnings:用于通知java编译器禁止特定的编译警告。
元注解
元注解可以理解为注解的注解。元注解的作用就是负责注解其他注解
可以看到@Override注解就有元注解在修饰标注。
元注解在jdk的lang.annotation包下能看到。jdk1.5提供了4个元注解。
@Target
用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
比如:METHOD:用于描述方法,上边截图的Override注解就只能作用在方法上。TYPE:用于描述类、接口(包括注解类型) 或enum声明,ElementType类有注释
@Retention
表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)。RetentionPolicy类有注释
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
比如上边截图的Override只是在源文件中有效,是为了保证编译正确使用的注解。
而sping的Controller注解就是在运行时有效,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理
@Documented,@Inherited暂时没有使用,等使用到了,再来补充。
自定义注解
@interface关键字,java实现自定义注解的语法。
使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。
比如实现一个自定义注解,web控制器标记:
package com.lxqn.jiapeng.spring.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Web控制器标记
* @author jiapeng
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Controller {
}
注解信息的获取
提供了标记的能力,目的还是获取这些注解信息。获取主要用的是Class类的方法,即反射。
- <T extends Annotation> T getAnnotation(Class<T> annotationClass): 返回改程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。
- Annotation[] getAnnotations():返回该程序元素上存在的所有注解。
- boolean is AnnotationPresent(Class<?extends Annotation> annotationClass):判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false.
- Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。
例子:
参考文章:
http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html
jdk1.8
spring-context-3.2.10