小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Java Annotation 高級(jí)應(yīng)用

 昵稱(chēng)40650 2007-09-07

  前言:

  前不久在matrix上先后發(fā)表了《java annotation 入門(mén)》、《java annotation 手冊(cè)》兩篇文章,比較全面的對(duì)java annotation的語(yǔ)法、原理、使用三方面進(jìn)行了闡述。由于《入門(mén)》中的簡(jiǎn)單例程雖然簡(jiǎn)單明了的說(shuō)明了annotation用法,但給大家的感覺(jué)可能是意猶未見(jiàn),所以在此行文《java annotation高級(jí)應(yīng)用》,具體實(shí)例化解釋annotation和annotation processing tool(APT)的使用。望能對(duì)各位的有所幫助。

  一、摘要:

  《java annotation高級(jí)應(yīng)用》具體實(shí)例化解釋annotation和annotation processing tool(APT)的使用。望能對(duì)各位的有所幫助。本文列舉了用于演示annotation的BRFW演示框架、演示APT的apt代碼實(shí)例,并對(duì)其進(jìn)行較為深度的分析,希望大家多多提意見(jiàn)。

  二、annotation實(shí)例分析

  1.BRFW(Beaninfo Runtime FrameWork)定義:

  本人編寫(xiě)的一個(gè)annotation功能演示框架。顧名思義,BRFW就是在運(yùn)行時(shí)取得bean信息的框架。

  2.BRFW的功能:

  A.源代碼級(jí)annotation:在bean的源代碼中使用annotation定義bean的信息;

  B.運(yùn)行時(shí)獲取bean數(shù)據(jù):在運(yùn)行時(shí)分析bean class中的annotation,并將當(dāng)前bean class中field信息取出,功能類(lèi)似xdoclet;

  C.運(yùn)行時(shí)bean數(shù)據(jù)的xml綁定:將獲得的bean數(shù)據(jù)構(gòu)造為xml文件格式展現(xiàn)。熟悉j2ee的朋友知道,這個(gè)功能類(lèi)似jaxb.

  3.BRFW框架:

  BRFW主要包含以下幾個(gè)類(lèi):

  A.Persistent類(lèi):定義了用于修飾類(lèi)的固有類(lèi)型成員變量的annotation.

  B.Exportable類(lèi):定義了用于修飾Class的類(lèi)型的annotation.

  C.ExportToXml類(lèi):核心類(lèi),用于完成BRFW的主要功能:將具有Exportable Annotation的bean對(duì)象轉(zhuǎn)換為xml格式文本。

  D.AddressForTest類(lèi):被A和B修飾過(guò)的用于測(cè)試目的的地址bean類(lèi)。其中包含了地址定義所必需的信息:國(guó)家、省級(jí)、城市、街道、門(mén)牌等。

  E.AddressListForTest類(lèi):被A和B修飾過(guò)的友人通訊錄bean類(lèi)。其中包含了通訊錄所必備的信息:友人姓名、年齡、電話、住址(成員為AddressForTest類(lèi)型的ArrayList)、備注。需要說(shuō)明的是電話這個(gè)bean成員變量是由字符串類(lèi)型組成的ArrayList類(lèi)型。由于朋友的住址可能不唯一,故這里的住址為由AddressForTest類(lèi)型組成的ArrayList.

  從上面的列表中,可以發(fā)現(xiàn)A、B用于修飾bean類(lèi)和其類(lèi)成員;C主要用于取出bean類(lèi)的數(shù)據(jù)并將其作xml綁定,代碼中使用了E作為測(cè)試類(lèi);E中可能包含著多個(gè)D.

  在了解了這個(gè)簡(jiǎn)單框架后,我們來(lái)看一下BRFW的代碼吧!

  4.BRFW源代碼分析:

  A.Persistent類(lèi):

  清單1:

package com.bjinfotech.practice.annotation.runtimeframework;

import java.lang.annotation.*;

/**
* 用于修飾類(lèi)的固有類(lèi)型成員變量的annotation
* @author cleverpig
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Persistent {
        String value() default "";
}

  B.Exportable類(lèi):

  清單2:

  package com.bjinfotech.practice.annotation.runtimeframework;

import java.lang.annotation.*;

/**
* 用于修飾類(lèi)的類(lèi)型的annotation
* @author cleverpig
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Exportable {
        //名稱(chēng)
        String name() default "";
        //描述
        String description() default "";
        //省略name和description后,用來(lái)保存name值
        String value() default "";
        
}
  C.AddressForTest類(lèi):

  清單3:

package com.bjinfotech.practice.annotation.runtimeframework;

/**
* 用于測(cè)試的地址類(lèi)
* @author cleverpig
*
*/
@Exportable("address")
public class AddressForTest {
        //國(guó)家
        @Persistent
        private String country=null;
        
        //省級(jí)
        @Persistent
        private String province=null;
        
        //城市
        @Persistent
        private String city=null;
        
        //街道
        @Persistent
        private String street=null;

        //門(mén)牌
        @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類(lèi):

  清單4:

  package com.bjinfotech.practice.annotation.runtimeframework;

import java.util.*;

/**
* 友人通訊錄
* 包含:姓名、年齡、電話、住址(多個(gè))、備注
* @author cleverpig
*
*/
@Exportable(name="addresslist",description="address list")
public class AddressListForTest {
        //友人姓名
        @Persistent
        private String friendName=null;
        
        //友人年齡
        @Persistent
        private int age=0;
        
        //友人電話
        @Persistent
        private ArrayList telephone=null;
        
        //友人住址:家庭、單位
        @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.telephone=new ArrayList(telephoneList);
                this.AddressForText=new ArrayList (addressList);
                this.note=note;
                
        }
}
  E.ExportToXml類(lèi):

  清單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的對(duì)象轉(zhuǎn)換為xml格式文本
* @author cleverpig
*
*/
public class ExportToXml {
        /**
         * 返回對(duì)象的成員變量的值(字符串類(lèi)型)
         * @param field 對(duì)象的成員變量
         * @param fieldTypeClass 對(duì)象的類(lèi)型
         * @param obj 對(duì)象
         * @return 對(duì)象的成員變量的值(字符串類(lèi)型)
         */
        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;
        }
        
        /**
         * 輸出對(duì)象的字段,當(dāng)對(duì)象的字段為Collection或者M(jìn)ap類(lèi)型時(shí),要調(diào)用exportObject方法繼續(xù)處理
         * @param obj 被處理的對(duì)象
         * @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()+"類(lèi)不是使用Exportable標(biāo)注過(guò)的");
                }
                
                //取出對(duì)象的成員變量
                Field[] fields=obj.getClass().getDeclaredFields();
                
                for(Field field:fields){
                        //獲得成員變量的標(biāo)注
                        Persistent fieldAnnotation=field.getAnnotation(Persistent.class);
                        if (fieldAnnotation==null){
                                continue;
                        }
                        //重要:避免java虛擬機(jī)檢查對(duì)私有成員的訪問(wèn)權(quán)限
                        field.setAccessible(true);
                        Class typeClass=field.getType();
                        String name=field.getName();
                        String value=getFieldValue(field,typeClass,obj);
                        
                        //如果獲得成員變量的值,則輸出
                        if (value!=null){
                                System.out.println(getIndent()+"<"+name+">\n"
                                                +getIndent()+"\t"+value+"\n"+getIndent()+"");
                        }
                        //處理成員變量中類(lèi)型為Collection或Map
                        else if ((field.get(obj) instanceof Collection)||
                                        (field.get(obj) instanceof Map)){
                                exportObject(field.get(obj));
                        }
                        else{
                                exportObject(field.get(obj));
                        }
                        
                }
        }
        
        //縮進(jìn)深度
        int levelDepth=0;
        //防止循環(huán)引用的檢查者,循環(huán)引用現(xiàn)象如:a包含b,而b又包含a
        CollectioncyclicChecker=new ArrayList

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多