Annotation是那些插入源码中的元数据,注解自身不会做任何事情,它需要工具支持才会有用。
一、注解的定义
注解的本质是借口(通过@interfacee定义),任何使用注解的地方,可看为是接口的实现。
定义如下:
package com.eyu.train.svn.security;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Authorize {
// 访问页面,如:/role.html
String value();
int doauth() default 0;
}
其中,Authroize为注解名称;
@Target指定注解作用的范围,其取值可有:
ElementType.ANNOTATION_TYPE注解类型声明
ElementType.CONSTRUCTOR构造方法声明
ElementType.FIELD字段声明(包括枚举常量)
ElementType.LOCAL_VARIABLE局部变量声明
ElementType.METHOD方法声明
ElementType.PACKAGE包声明
ElementType.RARAMETER参数声明
ElementType.TYPE类、接口(包括注解)或枚举
@Retention指定这个注解可以保留多久,其取值:
RetentionPolicy.RUNTIME 编译器将把注解记录到类文件中,在运行时VM将保留注解,因此可以反射性地读取。
RetentionPolicy.CLASS 编译器将把注解记录到类文件中,但在运行时将不会保留注解。
RetentionPolicy.SOURCE 编译器要丢弃的注解。
在注解定义时除上述两个注解,还有:
@Documented 指定这个注解应该包含在注解项的文档中
@Inherited 指定一个注解,作用在父类时,能够自动被子类继承
二、注解的使用
使用注解直接使用@AnnotationName(方法名=“XXX”)即可。
例如:
@Authorize("account.html")
@RequestMapping("/account/page")
@ResponseBody
public Page<Account> listAccountPager(
@RequestParam(required = false, defaultValue = "0") int page) {
return accountService.getAccountPager(page);
}
使用@Authorize()就可以使用刚刚的定义的注解了,注意String value();可以不用指定value="xxx",如果是其他方法名则需要指定,如:Authorize(doauth=2);
获取注解设置的值:
public static String AnnotationToString(Object obj) throws IllegalArgumentException, IllegalAccessException {
Class<?> clz = obj.getClass();
ClassName clzName = clz.getAnnotation(ClassName.class);
if (clzName == null)
return clz.getName() + "@" + obj.hashCode();
return clzName.value();
}