链接地址:http://www.xx566.com/detail/113.html
注解(Annotation)是JDK1.5引入的新特性,包含在java.lang.annotation包中,它是附加在代码中的一些元信息,在编 译、运行时进行解析和使用。Java内置了一些注解(如@Override、@Deprecated等),还支持自定义注解,一些知名的框架 Struts、Hibernate等都有自己实现的自定义注解,之前在项目中,自己定义过注解,主要用于过滤请求,控制action中方法的方法,有点拦 截器的味道,这里做下整理和总结。
注解的定义使用的是是@interface关键字,这里有个元注解的概念,作用是负责注解其他注解,也就是对自己定义的注解进行说明,JDK1.5中有四 种元注解:@Retention @Target @Document @Inherited,下面做个简要介绍。
@Retention,用于定义注解的保留策略,也就是注解的有效范围,有三种:
@Retention(RetentionPolicy.SOURCE) |
注解在源码中存在,在class中不存在 |
@Retention(RetentionPolicy.CLASS) |
默认的保留策略,注解在class中存在,在运行期无法获取 |
@Retention(RetentionPolicy.RUNTIME) | 注解在class中存在,在运行期可通过反射获取 |
@Target,用于描述注解的使用范围,有以下几种:
@Target(ElementType.TYPE) |
用于接口、类、枚举、注解 |
@Target(ElementType.FIELD) |
用于字段、枚举的常量 |
@Target(ElementType.METHOD) | 用于方法 |
@Target(ElementType.PARAMETER) |
用于方法参数 |
@Target(ElementType.CONSTRUCTOR) |
用于构造函数 |
@Target(ElementType.LOCAL_VARIABLE) |
用于局部变量 |
@Target(ElementType.ANNOTATION_TYPE) | 用于注解 |
@Target(ElementType.PACKAGE) | 用于包 |
@Document,表示该注解将被包含在javadoc中
@Inherited,表示子类可以继承父类中的该注解
当然,上面的注解都很重要,不过对于我来说,更多是用到前两个,而且也常用自定义注解控制权限等,这篇的自定义注解的学习demo,也只需要前两个,对于那些有可能自定义框架的大牛来说,每种注解都很重要哦,下面我们开始自定义注解的实现。
首先我们需要使用@interface定义一个注解,同时指定两个属性,一个名称,一个描述,如下:
package javase.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 定义一个注解类,指定对类和方法有效,在运行期有效 * 注解很像接口,对属性的定义类似于接口中方法的定义, * 需要使用括号() * @author Realfighter * */ @Target( { ElementType.TYPE, ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) public @interface Authority { /** * 名称,这里使用default指定默认值, 在使用注解的时候不指定name,则为默认值 */ String name() default ""; String describe();// 描述 }
定义好了注解,我们简单写一个测试类,使用这个注解,如下:
package javase.annotation; @Authority(describe = "注解类测试") public class AnnotationTest { @Authority(name = "test", describe = "注解方法测试") public void test() { System.out.println("hello annotation"); } }
很简单,是吧,那么我们又该怎么获取到注解里的描述信息呢,由于注解定义在运行期,那么我们可以利用class反射获取类的相关信息,具体示例代码如下:
package javase.annotation; import java.lang.reflect.Method; @Authority(describe = "注解类测试") public class AnnotationTest { @Authority(name = "test", describe = "注解方法测试") public void test() { System.out.println("hello annotation"); } public static void main(String[] args) { // 获取当前线程所在class Class<?> clazz = AnnotationTest.class; // 获取含有指定注解的类 Authority authorityClass = (Authority) clazz .getAnnotation(Authority.class); if (authorityClass != null) { System.out.println(authorityClass.describe()); Method[] methods = clazz.getDeclaredMethods(); for (Method method : methods) { // 判断方法上是否存在指定的注解 if (method.isAnnotationPresent(Authority.class)) { Authority authorityMethod = method .getAnnotation(Authority.class); System.out.println(authorityMethod.describe()); } } } } }