前言:

在此行文《java annotation高级应用》,具体实例化解释annotation和annotation processing tool(APT)的使用。望能对各位的有所帮助。

一、摘要:

《java annotation高级应用》具体实例化解释annotation和annotation processing tool(APT)的使用。望能对各位的有所帮助。本文列举了用于演示annotation的BRFW演示框架、演示APT的apt代码实例,并对其进行较为深度的分析,希望大家多多提意见。

二、annotation实例分析

1.BRFW(Beaninfo Runtime FrameWork)定义:

本人编写的一个annotation功能演示框架。顾名思义,BRFW就是在运行时取得bean信息的框架。

2.BRFW的功能:

A.源代码级annotation:在bean的源代码中使用annotation定义bean的信息;

B.运行时获取bean数据:在运行时分析bean class中的annotation,并将当前bean class中field信息取出,功能类似xdoclet;

C.运行时bean数据的xml绑定:将获得的bean数据构造为xml文件格式展现。熟悉j2ee的朋友知道,这个功能类似jaxb。

3.BRFW框架:

BRFW主要包含以下几个类:

A.Persistent类:定义了用于修饰类的固有类型成员变量的annotation。

B.Exportable类:定义了用于修饰Class的类型的annotation。

C.ExportToXml类:核心类,用于完成BRFW的主要功能:将具有Exportable Annotation的bean对象转换为xml格式文本。

D.AddressForTest类:被A和B修饰过的用于测试目的的地址bean类。其中包含了地址定义所必需的信息:国家、省级、城市、街道、门牌等。

E.AddressListForTest类:被A和B修饰过的友人通讯录bean类。其中包含了通讯录所必备的信息:友人姓名、年龄、电话、住址(成员为AddressForTest类型的 ArrayList)、备注。需要说明的是电话这个bean成员变量是由字符串类型组成的ArrayList类型。由于朋友的住址可能不唯一,故这里的住址为由AddressForTest类型组成的ArrayList。

从上面的列表中,可以发现A、B用于修饰bean类和其类成员;C主要用于取出bean类的数据并将其作xml绑定,代码中使用了E作为测试类;E中可能包含着多个D。

在了解了这个简单框架后,我们来看一下BRFW的代码吧!

4.BRFW源代码分析:

A.Persistent类:

清单1:

package com.bjinfotech.practice.annotation.runtimeframework;

import java.lang.annotation.*;

/**

* 用于修饰类的固有类型成员变量的annotation

* @author cleverpig

*

*/

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.FIELD)

public @interface Persistent {            String value() default "";   }   B.Exportable类:   清单2:   package com.bjinfotech.practice.annotation.runtimeframework;   import java.lang.annotation.*;   /**   * 用于修饰类的类型的annotation   * @author cleverpig   *   */   @Retention(RetentionPolicy.RUNTIME)   @Target(ElementType.TYPE)   public @interface Exportable {            //名称            String name() default "";            //描述            String description() default "";            //省略name和description后,用来保存name值            String value() default "";   }   C.AddressForTest类:   清单3:   package com.bjinfotech.practice.annotation.runtimeframework;   /**   * 用于测试的地址类   * @author cleverpig   *   */   @Exportable("address")   public class AddressForTest {            //国家            @Persistent            private String country=null;            //省级            @Persistent            private String province=null;            //城市            @Persistent            private String city=null;            //街道            @Persistent            private String street=null;            //门牌            @Persistent            private String doorplate=null;            public AddressForTest(String country,String province,                            String city,String street,String doorplate){                    this.country=country;                    this.province=province;                    this.city=city;                    this.street=street;                    this.doorplate=doorplate;            }   }   D.AddressListForTest类:   清单4:   package com.bjinfotech.practice.annotation.runtimeframework;   import java.util.*;   /**   * 友人通讯录   * 包含:姓名、年龄、电话、住址(多个)、备注   * @author cleverpig   *   */   @Exportable(name="addresslist",description="address list")   public class AddressListForTest {            //友人姓名            @Persistent            private String friendName=null;            //友人年龄            @Persistent            private int age=0;            //友人电话            @Persistent            private ArrayList teleph;            //友人住址:家庭、单位            @Persistent            private ArrayList AddressForText=null;            //备注            @Persistent            private String note=null;            public AddressListForTest(String name,int age,                            ArrayList telephoneList,                            ArrayList addressList,                            String note){                    this.friendName=name;                    this.age=age;                    this.teleph ArrayList(telephoneList);                    this.AddressForText=new ArrayList(addressList);                    this.note=note;            }   }   E.ExportToXml类:   清单5:   package com.bjinfotech.practice.annotation.runtimeframework;   import java.lang.reflect.Field;   import java.util.Collection;   import java.util.Iterator;   import java.util.Map;   import java.util.ArrayList;   /**   * 将具有Exportable Annotation的对象转换为xml格式文本   * @author cleverpig   *   */   public class ExportToXml {            /**             * 返回对象的成员变量的值(字符串类型)             * @param field 对象的成员变量             * @param fieldTypeClass 对象的类型             * @param obj 对象             * @return 对象的成员变量的值(字符串类型)             */            private String getFieldValue(Field field,Class fieldTypeClass,Object obj){                    String value=null;                    try{                            if (fieldTypeClass==String.class){                                    value=(String)field.get(obj);                            }                            else if (fieldTypeClass==int.class){                                    value=Integer.toString(field.getInt(obj));                            }                            else if (fieldTypeClass==long.class){                                    value=Long.toString(field.getLong(obj));                            }                            else if (fieldTypeClass==short.class){                                    value=Short.toString(field.getShort(obj));                            }                            else if (fieldTypeClass==float.class){                                    value=Float.toString(field.getFloat(obj));                            }                            else if (fieldTypeClass==double.class){                                    value=Double.toString(field.getDouble(obj));                            }                            else if (fieldTypeClass==byte.class){                                    value=Byte.toString(field.getByte(obj));                            }                            else if (fieldTypeClass==char.class){                                    value=Character.toString(field.getChar(obj));                            }                            else if (fieldTypeClass==boolean.class){                                    value=Boolean.toString(field.getBoolean(obj));                            }                    }                    catch(Exception ex){                            ex.printStackTrace();                            value=null;                    }                    return value;            }            /**             * 输出对象的字段,当对象的字段为Collection或者Map类型时,要调用exportObject方法继续处理             * @param obj 被处理的对象             * @throws Exception             */            public void exportFields(Object obj) throws Exception{                    Exportable exportable=obj.getClass().getAnnotation(Exportable.class);                            if (exportable!=null){                            if (exportable.value().length()>0){   //                                 System.out.println("Class annotation Name:"+exportable.value());                            }                            else{   //                                 System.out.println("Class annotation Name:"+exportable.name());                            }                    }                    else{   //                         System.out.println(obj.getClass()+"类不是使用Exportable标注过的");                    }                    //取出对象的成员变量                    Field[] fields=obj.getClass().getDeclaredFields();                    for(Field field:fields){                            //获得成员变量的标注                            Persistent fieldAnnotation=field.getAnnotation(Persistent.class);                            if (fieldAnnotation==null){                                    continue;                            }                            //重要:避免java虚拟机检查对私有成员的访问权限                            field.setAccessible(true);                            Class typeClass=field.getType();                            String name=field.getName();                            String value=getFieldValue(field,typeClass,obj);                            //如果获得成员变量的值,则输出                            if (value!=null){                                    System.out.println(getIndent()+"\n"                                                    +getIndent()+"\t"+value+"\n"+getIndent()+"");                            }                            //处理成员变量中类型为Collection或Map                            else if ((field.get(obj) instanceof Collection)||                                            (field.get(obj) instanceof Map)){                                    exportObject(field.get(obj));                            }                            else{                                    exportObject(field.get(obj));                            }                    }            }            //缩进深度            int levelDepth=0;            //防止循环引用的检查者,循环引用现象如:a包含b,而b又包含a            Collection

java annotation应用_Java Annotation高级应用相关推荐

  1. java annotation应用_java Annotation的应用

    一.Annotation 示例 Override Annotation 1 @Override2 public void onCreate(Bundle savedInstanceState); 二. ...

  2. java annotation入门_JAVA - Annotation 注解 入门

    Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...

  3. java annotation 属性_java annotation 获取属性

    自定义Annotation 1.声明一个annotation,类型是@interface //声明注解 @Target(ElementType.FIELD) @Retention(RetentionP ...

  4. java高级语言特性_Java语言高级特性——注解

    一 注解作用或意义 定义 Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制. 注解是元数据的一种形式,提供有关于程序但不属于程序本身的数据.注解对它们注 ...

  5. java 注解 对象_Java基础-学习使用Annotation注解对象

    Java基础-学习使用Annotation注解对象 注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某 个时刻非常方便地使用这些数据 1-1:基本语法 Java S ...

  6. java 注解变量赋值_Java Annotation详解...

    元数据的作用 如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类: l 编写文档:通过代码里标识的元数据生成文档. l 代码分析:通过代码里标识的元数据 ...

  7. Java中的注解(Annotation)处理器解析

    Java中的注解(Annotation)是一个很神奇的东西,特别现在有很多Android库都是使用注解的方式来实现的.一直想详细了解一下其中的原理.很有幸阅读到一篇详细解释编写注解处理器的文章.本文的 ...

  8. 深入理解Java:注解(Annotation)自定义注解入门

    要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5. ...

  9. Java 注解详解 (annotation)

    什么是java注解 注解是java5的新特性.注解可以看做一种注释或者元数据(MetaData),可以把它插入到我们的java代码中,用来描述我们的java类,从而影响java类的行为. Java注解 ...

最新文章

  1. oracle audit for 11g
  2. 不可思议的#define
  3. gin context和官方context_Go Web 小技巧(一)简化Gin接口代码
  4. 阅读英文论文的方法总结(三遍法)
  5. 模型预测控制的缺点_【电子技术】【2018.01】模型预测控制FPGA实现的协同设计...
  6. 2018蓝桥杯C++A组:三角形面积(海伦公式;向量的叉积)
  7. 百面机器学习—模型复杂度与模型的方差、偏差的关系
  8. c语言中dot作用,编程小组功能介绍及使用说明
  9. DirectX 9.0c游戏开发手记之RPG编程自学日志之17: Drawing with DirectX Graphics (用DirectX图形绘图)(第13节)
  10. Linux基础(八)服务器RAID及配置
  11. 一文讲清跨境S2B2C模式及线上品牌/新零售品牌实战打法
  12. 美国主要经济数据解注释
  13. 服务器受美国保护网站,该网站服务器受美国保护
  14. 《Cocos Creator游戏实战》棋类游戏中的棋子摆放逻辑
  15. 如何制作启动U盘安装系统?
  16. MATLAB中实现特定像素区域处理
  17. python array类型取特定值
  18. Apache Pulsar和Apache BookKeeper
  19. 字符串操作,截取最后一个逗号
  20. mac彩色球转不停,Mac电脑一直在转圈怎么办?

热门文章

  1. java 编译 器 ide_Java 8发布一年后,IDE和编译器尚未完全就绪
  2. Java EE 8怎么了? (第2部分)
  3. java用i/o查看文件_Java文件I / O基础
  4. Java:如何在不到5分钟的时间内通过Hazelcast提高生产力
  5. Spring构造函数依赖注入示例
  6. guava 并发_使用Guava对并发应用程序进行基于对象的微锁定
  7. apache mahout_使用Apache Mahout创建在线推荐系统
  8. Apache Spark RDD和Java流
  9. javafx 和swing_集成JavaFX和Swing
  10. java虚拟内存扩展_Java 8虚拟扩展方法