如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了。使用注解的过程中,很重要的一部分就是创建于使用注解处理器。Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处理器。

注解处理器类库(java.lang.reflect.AnnotatedElement):

  Java使用Annotation接口来代表程序元素前面的注解,该接口是所有Annotation类型的父接口。除此之外,Java在java.lang.reflect 包下新增了AnnotatedElement接口,该接口代表程序中可以接受注解的程序元素,该接口主要有如下几个实现类:

  Class:类定义
  Constructor:构造器定义
  Field:累的成员变量定义
  Method:类的方法定义
  Package:类的包定义

  java.lang.reflect 包下主要包含一些实现反射功能的工具类,实际上,java.lang.reflect 包所有提供的反射API扩充了读取运行时Annotation信息的能力。当一个Annotation类型被定义为运行时的Annotation后,该注解才能是运行时可见,当class文件被装载时被保存在class文件中的Annotation才会被虚拟机读取。
  AnnotatedElement 接口是所有程序元素(Class、Method和Constructor)的父接口,所以程序通过反射获取了某个类的AnnotatedElement对象之后,程序就可以调用该对象的如下四个个方法来访问Annotation信息:

  方法1: T getAnnotation(Class annotationClass): 返回改程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。
  方法2:Annotation[] getAnnotations():返回该程序元素上存在的所有注解。
  方法3:boolean is AnnotationPresent(Class<?extends Annotation> annotationClass):判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false.
  方法4:Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。

  一个简单的注解处理器:  

复制代码
/*注解声明*****/

/**
* 水果名称注解
* @author peida
*
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitName {
String value() default “”;
}

/**
* 水果颜色注解
* @author peida
*
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitColor {
/**
* 颜色枚举
* @author peida
*
*/
public enum Color{ BULE,RED,GREEN};

/*** 颜色属性* @return*/
Color fruitColor() default Color.GREEN;

}

/**
* 水果供应者注解
* @author peida
*
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitProvider {
/**
* 供应商编号
* @return
*/
public int id() default -1;

/*** 供应商名称* @return*/
public String name() default "";/*** 供应商地址* @return*/
public String address() default "";

}

/*注解使用*****/

public class Apple {

@FruitName("Apple")
private String appleName;@FruitColor(fruitColor=Color.RED)
private String appleColor;@FruitProvider(id=1,name="陕西红富士集团",address="陕西省西安市延安路89号红富士大厦")
private String appleProvider;public void setAppleColor(String appleColor) {this.appleColor = appleColor;
}
public String getAppleColor() {return appleColor;
}public void setAppleName(String appleName) {this.appleName = appleName;
}
public String getAppleName() {return appleName;
}public void setAppleProvider(String appleProvider) {this.appleProvider = appleProvider;
}
public String getAppleProvider() {return appleProvider;
}public void displayName(){System.out.println("水果的名字是:苹果");
}

}

/*注解处理器*****/

public class FruitInfoUtil {
public static void getFruitInfo(Class<?> clazz){

    String strFruitName=" 水果名称:";String strFruitColor=" 水果颜色:";String strFruitProvicer="供应商信息:";Field[] fields = clazz.getDeclaredFields();for(Field field :fields){if(field.isAnnotationPresent(FruitName.class)){FruitName fruitName = (FruitName) field.getAnnotation(FruitName.class);strFruitName=strFruitName+fruitName.value();System.out.println(strFruitName);}else if(field.isAnnotationPresent(FruitColor.class)){FruitColor fruitColor= (FruitColor) field.getAnnotation(FruitColor.class);strFruitColor=strFruitColor+fruitColor.fruitColor().toString();System.out.println(strFruitColor);}else if(field.isAnnotationPresent(FruitProvider.class)){FruitProvider fruitProvider= (FruitProvider) field.getAnnotation(FruitProvider.class);strFruitProvicer=" 供应商编号:"+fruitProvider.id()+" 供应商名称:"+fruitProvider.name()+" 供应商地址:"+fruitProvider.address();System.out.println(strFruitProvicer);}}
}

}

/*输出结果*****/
public class FruitRun {

/*** @param args*/
public static void main(String[] args) {FruitInfoUtil.getFruitInfo(Apple.class);}

}

====================================
水果名称:Apple
水果颜色:RED
供应商编号:1 供应商名称:陕西红富士集团 供应商地址:陕西省西安市延安路89号红富士大厦
复制代码
  Java注解的基础知识点基本都过了一遍,下一篇我们通过设计一个基于注解的简单的ORM框架,来综合应用和进一步加深对注解的各个知识点的理解和运用。

深入理解Java注解Annotation之注解处理器相关推荐

  1. java基础-注解Annotation原理和用法

    转载自 http://www.wolfbe.com/detail/201608/265.html 在很多java代码中都可以看到诸如@Override.@Deprecated.@SuppressWar ...

  2. java 注解: Annotation

    java 注解: Annotation 普通注解 自定义注解 元注解 注解: 位于源码中,用来修饰程序的元素,但不会对被修饰的对象有直接的影响. 可增加程序的动态性. 普通注解 普通注解:为java代 ...

  3. 一小时搞明白自定义注解(Annotation)

    原文链接:http://blog.csdn.net/u013045971/article/details/53433874 什么是注解 Annotation(注解)就是Java提供了一种元程序中的元素 ...

  4. java 注解值_java 注解默认值操作

    我就废话不多说了,大家还是直接看代码吧~ package com.zejian.annotationdemo; import java.lang.annotation.ElementType; imp ...

  5. java 注解学习_java注解的学习

    package package3; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; im ...

  6. java运行时读取注解_Java自定义注解和运行时靠反射获取注解

    转:1.Annotation的工作原理: JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型.该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰 ...

  7. spring中自定义注解(annotation)与AOP中获取注解___使用aspectj的@Around注解实现用户操作和操作结果日志

    spring中自定义注解(annotation)与AOP中获取注解 一.自定义注解(annotation) 自定义注解的作用:在反射中获取注解,以取得注解修饰的类.方法或属性的相关解释. packag ...

  8. java注释和注解_注释注解JAVA注解

    发一下牢骚和主题无关: package anno; import java.lang.annotation.Retention; import java.lang.annotation.Retenti ...

  9. 注解_自定义注解_元注解

    * 元注解:用于描述注解的注解 * @Target:描述注解能够作用的位置* ElementType取值:* TYPE:可以作用于类上* METHOD:可以作用于方法上* FIELD:可以作用于成员变 ...

最新文章

  1. 使用Python,OpenCV进行图像哈希
  2. ViSP中识别AprilTag的C++实例代码与运行结果
  3. 直播预告丨如何用 A/B 测试做好一场页面布局试验?
  4. go rpc安装方法
  5. java对象克隆的例子_Java对象克隆
  6. 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比。...
  7. 系统修复对电脑的影响有哪些
  8. 【转】用Terracotta实现Master-Worker
  9. Raki的读paper小记:Empower Entity Set Expansion via Language Model Probing
  10. xxl-job架构源码解析
  11. iOS YYKit学习之YYText的使用
  12. phpword 模板替换文字和图片
  13. github Dns 污染
  14. Java脚本数组复制
  15. 多线程 委托 匿名函数 拉姆达 事件
  16. 用C语言对一元二次方程求解
  17. 对随机变量值域的思考
  18. CSP 201609-3 炉石传说(C++)
  19. 浏览器首页被劫持(解决)-桔梗网
  20. 服务器上批量将.mp4格式的视频转化成.m3u8的shell脚本

热门文章

  1. 皮一皮:晚上千万千万别乱拍照...
  2. Spring Boot 2.x基础教程:使用Redis的发布订阅功能
  3. Kafka如果丢了消息,怎么处理的?
  4. 云原生收购潮:思科计划收购Portshift;Kasten加入Veeam
  5. 每日一皮:传说中的三次握手...
  6. IntelliJ IDEA 重大更新:支持CPU火焰图,新增酷炫主题
  7. 华为SAN存储在linux下的,多路径 - 华为SAN存储在SUSE系统下的主机连通性指南 - 华为...
  8. 安卓摄像头 data 转bitmap
  9. cannot import name 'SpeechLib'
  10. ffmpeg3.4 yuv编码为h264