网站后台怎么上传图片产品,互联网商城有限公司,微信电脑版官方下载,公司制作网站前言#xff1a;在此行文《java annotation高级应用》#xff0c;具体实例化解释annotation和annotation processing tool(APT)的使用。望能对各位的有所帮助。一、摘要#xff1a;《java annotation高级应用》具体实例化解释annotation和annotation processing tool(APT)的…前言在此行文《java annotation高级应用》具体实例化解释annotation和annotation processing tool(APT)的使用。望能对各位的有所帮助。一、摘要《java annotation高级应用》具体实例化解释annotation和annotation processing tool(APT)的使用。望能对各位的有所帮助。本文列举了用于演示annotation的BRFW演示框架、演示APT的apt代码实例并对其进行较为深度的分析希望大家多多提意见。二、annotation实例分析1BRFW(Beaninfo Runtime FrameWork)定义本人编写的一个annotation功能演示框架。顾名思义BRFW就是在运行时取得bean信息的框架。2BRFW的功能A源代码级annotation在bean的源代码中使用annotation定义bean的信息B运行时获取bean数据在运行时分析bean class中的annotation并将当前bean class中field信息取出功能类似xdocletC运行时bean数据的xml绑定将获得的bean数据构造为xml文件格式展现。熟悉j2ee的朋友知道这个功能类似jaxb。3BRFW框架BRFW主要包含以下几个类APersistent类定义了用于修饰类的固有类型成员变量的annotation。BExportable类定义了用于修饰Class的类型的annotation。CExportToXml类核心类用于完成BRFW的主要功能将具有Exportable Annotation的bean对象转换为xml格式文本。DAddressForTest类被A和B修饰过的用于测试目的的地址bean类。其中包含了地址定义所必需的信息国家、省级、城市、街道、门牌等。EAddressListForTest类被A和B修饰过的友人通讯录bean类。其中包含了通讯录所必备的信息友人姓名、年龄、电话、住址(成员为AddressForTest类型的 ArrayList)、备注。需要说明的是电话这个bean成员变量是由字符串类型组成的ArrayList类型。由于朋友的住址可能不唯一故这里的住址为由AddressForTest类型组成的ArrayList。从上面的列表中可以发现A、B用于修饰bean类和其类成员C主要用于取出bean类的数据并将其作xml绑定代码中使用了E作为测试类E中可能包含着多个D。在了解了这个简单框架后我们来看一下BRFW的代码吧4BRFW源代码分析APersistent类清单1package com.bjinfotech.practice.annotation.runtimeframework;import java.lang.annotation.*;/*** 用于修饰类的固有类型成员变量的annotation* author cleverpig**/Retention(RetentionPolicy.RUNTIME)Target(ElementType.FIELD)public interface Persistent { String value() default ; } BExportable类 清单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 ; } CAddressForTest类 清单3 package com.bjinfotech.practice.annotation.runtimeframework; /** * 用于测试的地址类 * author cleverpig * */ Exportable(address) public class AddressForTest { //国家 Persistent private String countrynull; //省级 Persistent private String provincenull; //城市 Persistent private String citynull; //街道 Persistent private String streetnull; //门牌 Persistent private String doorplatenull; public AddressForTest(String country,String province, String city,String street,String doorplate){ this.countrycountry; this.provinceprovince; this.citycity; this.streetstreet; this.doorplatedoorplate; } } DAddressListForTest类 清单4 package com.bjinfotech.practice.annotation.runtimeframework; import java.util.*; /** * 友人通讯录 * 包含姓名、年龄、电话、住址(多个)、备注 * author cleverpig * */ Exportable(nameaddresslist,descriptionaddress list) public class AddressListForTest { //友人姓名 Persistent private String friendNamenull; //友人年龄 Persistent private int age0; //友人电话 Persistent private ArrayList teleph; //友人住址家庭、单位 Persistent private ArrayList AddressForTextnull; //备注 Persistent private String notenull; public AddressListForTest(String name,int age, ArrayList telephoneList, ArrayList addressList, String note){ this.friendNamename; this.ageage; this.teleph ArrayList(telephoneList); this.AddressForTextnew ArrayList(addressList); this.notenote; } } EExportToXml类 清单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 valuenull; try{ if (fieldTypeClassString.class){ value(String)field.get(obj); } else if (fieldTypeClassint.class){ valueInteger.toString(field.getInt(obj)); } else if (fieldTypeClasslong.class){ valueLong.toString(field.getLong(obj)); } else if (fieldTypeClassshort.class){ valueShort.toString(field.getShort(obj)); } else if (fieldTypeClassfloat.class){ valueFloat.toString(field.getFloat(obj)); } else if (fieldTypeClassdouble.class){ valueDouble.toString(field.getDouble(obj)); } else if (fieldTypeClassbyte.class){ valueByte.toString(field.getByte(obj)); } else if (fieldTypeClasschar.class){ valueCharacter.toString(field.getChar(obj)); } else if (fieldTypeClassboolean.class){ valueBoolean.toString(field.getBoolean(obj)); } } catch(Exception ex){ ex.printStackTrace(); valuenull; } return value; } /** * 输出对象的字段当对象的字段为Collection或者Map类型时要调用exportObject方法继续处理 * param obj 被处理的对象 * throws Exception */ public void exportFields(Object obj) throws Exception{ Exportable exportableobj.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[] fieldsobj.getClass().getDeclaredFields(); for(Field field:fields){ //获得成员变量的标注 Persistent fieldAnnotationfield.getAnnotation(Persistent.class); if (fieldAnnotationnull){ continue; } //重要:避免java虚拟机检查对私有成员的访问权限 field.setAccessible(true); Class typeClassfield.getType(); String namefield.getName(); String valuegetFieldValue(field,typeClass,obj); //如果获得成员变量的值则输出 if (value!null){ System.out.println(getIndent()\n getIndent()\tvalue\ngetIndent()); } //处理成员变量中类型为Collection或Map else if ((field.get(obj) instanceof Collection)|| (field.get(obj) instanceof Map)){ exportObject(field.get(obj)); } else{ exportObject(field.get(obj)); } } } //缩进深度 int levelDepth0; //防止循环引用的检查者循环引用现象如a包含b而b又包含a Collection