仓酷云
标题:
JAVA编程:进修教程:Java Annotation 初级使用
[打印本页]
作者:
小妖女
时间:
2015-1-18 11:12
标题:
JAVA编程:进修教程:Java Annotation 初级使用
还得说上一点,就java本质而言,是面相对象的,但是你有没有发现,java也不全是,比如说基本类型,int,那他就是整型而不是对象,转换类型是还得借助包装类。初级|教程
媒介:
前不久在matrix上前后宣布了《javaannotation进门》、《javaannotation手册》两篇文章,对照周全的对javaannotation的语法、道理、利用三方面举行了论述。因为《进门》中的复杂例程固然复杂了然的申明了annotation用法,但给人人的感到多是意犹未见,以是在此行文《javaannotation初级使用》,详细实例化注释annotation和annotationprocessingtool(APT)的利用。看能对列位的有所匡助。
1、择要:
《javaannotation初级使用》详细实例化注释annotation和annotationprocessingtool(APT)的利用。看能对列位的有所匡助。本文枚举了用于演示annotation的BRFW演示框架、演示APT的apt代码实例,并对其举行较为深度的剖析,但愿人人多多提定见。
2、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
privateArrayListtelephone=null;
//朋友住址:家庭、单元
@Persistent
privateArrayListAddressForText=null;
//备注
@Persistent
privateStringnote=null;
publicAddressListForTest(Stringname,intage,
ArrayListtelephoneList,
ArrayListaddressList,
Stringnote){
this.friendName=name;
this.age=age;
this.telephone=newArrayList(telephoneList);
this.AddressForText=newArrayList(addressList);
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+">
"
+getIndent()+" "+value+"
"+getIndent()+"");
}
//处置成员变量中范例为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
CollectioncyclicChecker=newArrayList
你说是sun公司对她研究的透还是微软?针对自己工具开发的.net性能上肯定会站上风的。
作者:
飘灵儿
时间:
2015-1-19 16:11
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
作者:
冷月葬花魂
时间:
2015-1-24 13:44
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
作者:
精灵巫婆
时间:
2015-1-28 05:47
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
作者:
第二个灵魂
时间:
2015-2-2 20:14
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
作者:
再见西城
时间:
2015-2-8 04:46
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
作者:
小魔女
时间:
2015-2-11 20:52
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
作者:
灵魂腐蚀
时间:
2015-2-28 06:48
是一种突破用户端机器环境和CPU
作者:
若天明
时间:
2015-3-9 21:27
是一种为 Internet发展的计算机语言
作者:
因胸联盟
时间:
2015-3-10 21:28
是一种将安全性(Security)列为第一优先考虑的语言
作者:
只想知道
时间:
2015-3-17 10:11
是一种使网页(Web Page)产生生动活泼画面的语言
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2