Java Annotation 高级应用Word文档下载推荐.docx
- 文档编号:21965843
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:16
- 大小:23.84KB
Java Annotation 高级应用Word文档下载推荐.docx
《Java Annotation 高级应用Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Java Annotation 高级应用Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。
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源代码分析:
清单1:
packagecom.bjinfotech.practice.annotation.runtimeframework;
importjava.lang.annotation.*;
/**
*用于修饰类的固有类型成员变量的annotation
*@authorcleverpig
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public@interfacePersistent{
Stringvalue()default"
"
;
}
清单2:
*用于修饰类的类型的annotation
@Target(ElementType.TYPE)
public@interfaceExportable{
//名称
Stringname()default"
//描述
Stringdescription()default"
//省略name和description后,用来保存name值
C.AddressForTest类:
清单3:
*用于测试的地址类
@Exportable("
address"
)
publicclassAddressForTest{
//国家
@Persistent
privateStringcountry=null;
//省级
privateStringprovince=null;
//城市
privateStringcity=null;
//街道
privateStringstreet=null;
//门牌
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:
importjava.util.*;
*友人通讯录
*包含:
姓名、年龄、电话、住址(多个)、备注
@Exportable(name="
addresslist"
description="
addresslist"
publicclassAddressListForTest{
//友人姓名
privateStringfriendName=null;
//友人年龄
privateintage=0;
//友人电话
privateArrayList<
String>
telephone=null;
//友人住址:
家庭、单位
AddressForTest>
AddressForText=null;
//备注
privateStringnote=null;
publicAddressListForTest(Stringname,intage,
ArrayList<
telephoneList,
addressList,
Stringnote){
this.friendName=name;
this.age=age;
this.telephone=newArrayList<
(telephoneList);
this.AddressForText=newArrayList<
(addressList);
this.note=note;
E.ExportToXml类:
清单5:
importjava.lang.reflect.Field;
importjava.util.Collection;
importjava.util.Iterator;
importjava.util.Map;
importjava.util.ArrayList;
*将具有ExportableAnnotation的对象转换为xml格式文本
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{
+exportable.name());
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!
System.out.println(getIndent()+"
<
+name+"
>
\n"
+getIndent()+"
\t"
+value+"
/"
//处理成员变量中类型为Collection或Map
elseif((field.get(obj)instanceofCollection)||
(field.get(obj)instanceofMap)){
exportObject(field.get(obj));
//缩进深度
intlevelDepth=0;
//防止循环引用的检查者,循环引用现象如:
a包含b,而b又包含a
Collection<
Object>
cyclicChecker=newArrayList<
();
*返回缩进字符串
*@return
privateStringgetIndent(){
Strings="
for(inti=0;
i<
levelDepth;
i++){
s+="
returns;
*输出对象,如果对象类型为Collection和Map类型,则需要递归调用exportObject进行处理
*@paramobj
publicvoidexp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java Annotation 高级应用 高级 应用