Java Annotation 高级应用.docx
- 文档编号:8829681
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:16
- 大小:23.84KB
Java Annotation 高级应用.docx
《Java Annotation 高级应用.docx》由会员分享,可在线阅读,更多相关《Java Annotation 高级应用.docx(16页珍藏版)》请在冰豆网上搜索。
JavaAnnotation高级应用
JavaAnnotation高级应用
作者:
cleverpig
版权声明:
本文可以自由转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
作者:
cleverpig(作者的Blog:
原文:
关键字:
java,annotation,apt
前言:
前不久在matrix上先后发表了《javaannotation入门》、《javaannotation手册》两篇文章,比较全面的对javaannotation的语法、原理、使用三方面进行了阐述。
由于《入门》中的简单例程虽然简单明了的说明了annotation用法,但给大家的感觉可能是意犹未见,所以在此行文《javaannotation高级应用》,具体实例化解释annotation和annotationprocessingtool(APT)的使用。
望能对各位的有所帮助。
一、摘要:
《javaannotation高级应用》具体实例化解释annotation和annotationprocessingtool(APT)的使用。
望能对各位的有所帮助。
本文列举了用于演示annotation的BRFW演示框架、演示APT的apt代码实例,并对其进行较为深度的分析,希望大家多多提意见。
二、annotation实例分析
1.BRFW(BeaninfoRuntimeFrameWork)定义:
本人编写的一个annotation功能演示框架。
顾名思义,BRFW就是在运行时取得bean信息的框架。
2.BRFW的功能:
A.源代码级annotation:
在bean的源代码中使用annotation定义bean的信息;
B.运行时获取bean数据:
在运行时分析beanclass中的annotation,并将当前beanclass中field信息取出,功能类似xdoclet;
C.运行时bean数据的xml绑定:
将获得的bean数据构造为xml文件格式展现。
熟悉j2ee的朋友知道,这个功能类似jaxb。
3.BRFW框架:
BRFW主要包含以下几个类:
A.Persistent类:
定义了用于修饰类的固有类型成员变量的annotation。
B.Exportable类:
定义了用于修饰Class的类型的annotation。
C.ExportToXml类:
核心类,用于完成BRFW的主要功能:
将具有ExportableAnnotation的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:
packagecom.bjinfotech.practice.annotation.runtimeframework;
importjava.lang.annotation.*;
/**
*用于修饰类的固有类型成员变量的annotation
*@authorcleverpig
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public@interfacePersistent{
Stringvalue()default"";
}
B.Exportable类:
清单2:
packagecom.bjinfotech.practice.annotation.runtimeframework;
importjava.lang.annotation.*;
/**
*用于修饰类的类型的annotation
*@authorcleverpig
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public@interfaceExportable{
//名称
Stringname()default"";
//描述
Stringdescription()default"";
//省略name和description后,用来保存name值
Stringvalue()default"";
}
C.AddressForTest类:
清单3:
packagecom.bjinfotech.practice.annotation.runtimeframework;
/**
*用于测试的地址类
*@authorcleverpig
*
*/
@Exportable("address")
publicclassAddressForTest{
//国家
@Persistent
privateStringcountry=null;
//省级
@Persistent
privateStringprovince=null;
//城市
@Persistent
privateStringcity=null;
//街道
@Persistent
privateStringstreet=null;
//门牌
@Persistent
privateStringdoorplate=null;
publicAddressForTest(Stringcountry,Stringprovince,
Stringcity,Stringstreet,Stringdoorplate){
this.country=country;
this.province=province;
this.city=city;
this.street=street;
this.doorplate=doorplate;
}
}
D.AddressListForTest类:
清单4:
packagecom.bjinfotech.practice.annotation.runtimeframework;
importjava.util.*;
/**
*友人通讯录
*包含:
姓名、年龄、电话、住址(多个)、备注
*@authorcleverpig
*
*/
@Exportable(name="addresslist",description="addresslist")
publicclassAddressListForTest{
//友人姓名
@Persistent
privateStringfriendName=null;
//友人年龄
@Persistent
privateintage=0;
//友人电话
@Persistent
privateArrayList
//友人住址:
家庭、单位
@Persistent
privateArrayList
//备注
@Persistent
privateStringnote=null;
publicAddressListForTest(Stringname,intage,
ArrayList
ArrayList
Stringnote){
this.friendName=name;
this.age=age;
this.telephone=newArrayList
this.AddressForText=newArrayList
this.note=note;
}
}
E.ExportToXml类:
清单5:
packagecom.bjinfotech.practice.annotation.runtimeframework;
importjava.lang.reflect.Field;
importjava.util.Collection;
importjava.util.Iterator;
importjava.util.Map;
importjava.util.ArrayList;
/**
*将具有ExportableAnnotation的对象转换为xml格式文本
*@authorcleverpig
*
*/
publicclassExportToXml{
/**
*返回对象的成员变量的值(字符串类型)
*@paramfield对象的成员变量
*@paramfieldTypeClass对象的类型
*@paramobj对象
*@return对象的成员变量的值(字符串类型)
*/
privateStringgetFieldValue(Fieldfield,ClassfieldTypeClass,Objectobj){
Stringvalue=null;
try{
if(fieldTypeClass==String.class){
value=(String)field.get(obj);
}
elseif(fieldTypeClass==int.class){
value=Integer.toString(field.getInt(obj));
}
elseif(fieldTypeClass==long.class){
value=Long.toString(field.getLong(obj));
}
elseif(fieldTypeClass==short.class){
value=Short.toString(field.getShort(obj));
}
elseif(fieldTypeClass==float.class){
value=Float.toString(field.getFloat(obj));
}
elseif(fieldTypeClass==double.class){
value=Double.toString(field.getDouble(obj));
}
elseif(fieldTypeClass==byte.class){
value=Byte.toString(field.getByte(obj));
}
elseif(fieldTypeClass==char.class){
value=Character.toString(field.getChar(obj));
}
elseif(fieldTypeClass==boolean.class){
value=Boolean.toString(field.getBoolean(obj));
}
}
catch(Exceptionex){
ex.printStackTrace();
value=null;
}
returnvalue;
}
/**
*输出对象的字段,当对象的字段为Collection或者Map类型时,要调用exportObject方法继续处理
*@paramobj被处理的对象
*@throwsException
*/
publicvoidexportFields(Objectobj)throwsException{
Exportableexportable=obj.getClass().getAnnotation(Exportable.class);
if(exportable!
=null){
if(exportable.value().length()>0){
// System.out.println("ClassannotationName:
"+exportable.value());
}
else{
// System.out.println("ClassannotationName:
"+exportable.name());
}
}
else{
// System.out.println(obj.getClass()+"类不是使用Exportable标注过的");
}
//取出对象的成员变量
Field[]fields=obj.getClass().getDeclaredFields();
for(Fieldfield:
fields){
//获得成员变量的标注
PersistentfieldAnnotation=field.getAnnotation(Persistent.class);
if(fieldAnnotation==null){
continue;
}
//重要:
避免java虚拟机检查对私有成员的访问权限
field.setAccessible(true);
ClasstypeClass=field.getType();
Stringname=field.getName();
Stringvalue=getFieldValue(field,typeClass,obj);
//如果获得成员变量的值,则输出
if(value!
=null){
System.out.println(getIndent()+"<"+name+">\n"
+getIndent()+"\t"+value+"\n"+getIndent()+""+name+">");
}
//处理成员变量中类型为Collection或Map
elseif((field.get(obj)instanceofCollection)||
(field.get(obj)instanceofMap)){
exportObject(field.get(obj));
}
else{
exportObject(field.get(obj));
}
}
}
//缩进深度
intlevelDepth=0;
//防止循环引用的检查者,循环引用现象如:
a包含b,而b又包含a
Collection
/**
*返回缩进字符串
*@return
*/
privateStringgetIndent(){
Strings="";
for(inti=0;i s+="\t"; } returns; } /** *输出对象,如果对象类型为Collection和Map类型,则需要递归调用exportObject进行处理 *@paramobj *@throwsException */ publicvoidexp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java Annotation 高级应用 高级 应用