一: 定义注解实体
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 类描述:分页注解
* @version 1.0 CreateDate: 2015-2-10
*
* @history:
* @updateDate @updatePerson @declare
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER,ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
public @interface PagerAnno {
String value();
}
1:元注解是指注解的注解。包括 @Retention @Target @Document @Inherited四种
2:元注解之 @Retention (保留)
@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
3 :元注解之 @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) ///包
4 : 元注解之@Document
@Document:说明该注解将被包含在javadoc中
5 : 元注解之@Inherited
@Inherited:说明子类可以继承父类中的该注解
4 : 元注解之@Document
@Document:说明该注解将被包含在javadoc中
5 : 元注解之@Inherited
@Inherited:说明子类可以继承父类中的该注解
二:使用注解
package commons.anno;
import org.apache.ibatis.annotations.Param;
/**
* 类描述: 注解寄主
* @version 1.0 CreateDate: 2015-2-11
*
* @history:
* @updateDate @updatePerson @declare
*
*/
@PagerAnno("注释到类ApplTest")
public class ApplTest {
@PagerAnno("注释到类成员变量.....")
private String name;
@PagerAnno("注释到方法sysHi")
public void sysHi(){
System.out.println("hi......");
}
@PagerAnno("注释到方法sysHello")
public void sysHello(@Param("mybatis 注解--> @param")@PagerAnno("注释到方法参数String name")String name){
System.out.println("hello");
}
}
三:获取注解
package commons.anno;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.apache.ibatis.annotations.Param;
/**
* 类描述: 注解测试入口
* @version 1.0 CreateDate: 2015-2-11
*
* @history:
* @updateDate @updatePerson @declare
*
*/
public class Acce {
public static void main(String[] args) {
//打印类上的注解
Annotation[] annoArry = ApplTest.class.getAnnotations();
for(Annotation anno : annoArry){
if(anno instanceof PagerAnno){
System.out.println(((PagerAnno)anno).value());
}
}
Method[] methodArry = ApplTest.class.getMethods();
for(Method method : methodArry){
//打印方法上的注解
for(Annotation anno : method.getAnnotations()){
if(anno instanceof PagerAnno){
System.out.println(((PagerAnno)anno).value());
}
}
//打印方法形参上的注解
for(Annotation[] annos : method.getParameterAnnotations()){
for(Annotation anno : annos){
if(anno instanceof PagerAnno){
System.out.println(((PagerAnno)anno).value());
}else if(anno instanceof Param){
System.out.println(((Param)anno).value());
}
}
}
}
//打印成员变量上的注解
Field[] fieldArry = ApplTest.class.getDeclaredFields();
for(Field field : fieldArry){
for(Annotation anno : field.getAnnotations()){
if(anno instanceof PagerAnno){
System.out.println(((PagerAnno)anno).value());
}
}
}
}
}