<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ricegun

    BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
      2 Posts :: 4 Stories :: 3 Comments :: 0 Trackbacks

    2010年8月4日 #

    背景知識(shí):
    從JDK5開(kāi)始提供名為Annotation(注釋?zhuān)┑墓δ埽欢x為JSR-175規(guī)范。注釋是以“@注釋名”在代碼中存在的,還可以添加一些參數(shù)值,例如:@SuppressWarnings(value="unchecked")。注釋可以附加在package, class, method, field等上面,相當(dāng)于給它們添加了額外的輔助信息,我們可以通過(guò)反射機(jī)制編程實(shí)現(xiàn)對(duì)這些元數(shù)據(jù)的訪(fǎng)問(wèn)。如果沒(méi)有外部解析工具等對(duì)其加以解析和處理的情況,本身不會(huì)對(duì)Java的源代碼或class文件等產(chǎn)生任何影響,也不會(huì)對(duì)它們的執(zhí)行產(chǎn)生任何影響。
    元數(shù)據(jù)的作用,大致可分為三種:編寫(xiě)文檔,通過(guò)代碼里標(biāo)識(shí)的元數(shù)據(jù)生成文檔;代碼分析,通過(guò)代碼里標(biāo)識(shí)的元數(shù)據(jù)對(duì)代碼進(jìn)行分析;編譯檢查,通過(guò)代碼里標(biāo)識(shí)的元數(shù)據(jù)讓編譯器能實(shí)現(xiàn)基本的編譯檢查。
    JDK5內(nèi)置的基本注釋
    JDK5內(nèi)置了一些常用的注釋?zhuān)梢栽诰幾g時(shí)幫我們捕獲部分編譯錯(cuò)誤,及提示信息,下面介紹下這些注釋的用法:
    1、@Override定義在java.lang.Override中,此注釋只適用于修辭方法,表示一個(gè)方法聲明打算重寫(xiě)超類(lèi)中的另一個(gè)方法聲明。如果方法利用此注釋類(lèi)型進(jìn)行注解但沒(méi)有重寫(xiě)超類(lèi)方法,則編譯器會(huì)生成一條錯(cuò)誤消息。例如我們?yōu)槟愁?lèi)重寫(xiě)toString()方法卻寫(xiě)成了tostring(),并且我們?yōu)樵摲椒ㄌ砑恿?#64;Override注釋?zhuān)淮a如下:
    public class OverrideDemo {
        @Override
    public String tostring() {
            return super.toString();
        }
    }
    在編譯時(shí),會(huì)提示以下錯(cuò)誤信息:
    OverrideTest.java:4: 方法未覆蓋其父類(lèi)的方法
            @Override
             ^1 錯(cuò)誤
    2、@Deprecated定義在java.lang.Deprecated中,此注釋可用于修辭方法、屬性、類(lèi),表示不鼓勵(lì)程序員使用這樣的元素,通常是因?yàn)樗芪kU(xiǎn)或存在更好的選擇。在使用不被贊成的程序元素或在不被贊成的代碼中執(zhí)行重寫(xiě)時(shí),編譯器會(huì)發(fā)出警告。使用@Deprecated的示例代碼如下:
    public class DeprecatedDemo {
        public static void main(String[] args) {
             DeprecatedClass.DeprecatedMethod();
        }
    }
     
    class DeprecatedClass {
        @Deprecated
        public static void DeprecatedMethod() {
            // TODO
        }
    }
    在編譯時(shí),會(huì)得到以下提示信息:
    注意:DeprecatedDemo.java 使用或覆蓋了已過(guò)時(shí)的 API
    注意:要了解詳細(xì)信息,請(qǐng)使用 -Xlint:deprecation 重新編譯。
    如果在編譯時(shí)添加-Xlint:deprecation參數(shù),我們能更清楚的看到該警告的詳細(xì)信息,如下:
    DeprecatedDemo.java:6: 警告:[deprecation] SomeClass 中的 DeprecatedMethod() 已過(guò)時(shí)
                    SomeClass.DeprecatedMethod();
                             ^1 警告
    要注意@Deprecated與@deprecated的區(qū)別,@deprecated是為了生成文檔的需要,例如:
    class DeprecatedClass {
            /**
    * @deprecated 此方法已過(guò)時(shí),不建議使用
    */
    @Deprecated
        public static void DeprecatedMethod() {
            // TODO
        }
    }
     3、@SuppressWarnings定義在java.lang.SuppressWarnings中,用來(lái)抑制編譯時(shí)的警告信息。與前兩個(gè)注釋有所不同,你需要添加一個(gè)參數(shù)才能正確使用,這些參數(shù)值都是已經(jīng)定義好了的,我們選擇性的使用就好了,參數(shù)如下:
    參數(shù)
    說(shuō)明
    deprecation
    使用了過(guò)時(shí)的類(lèi)或方法時(shí)的警告
    unchecked
    執(zhí)行了未檢查的轉(zhuǎn)換時(shí)的警告,例如當(dāng)使用集合時(shí)沒(méi)有用泛型 (Generics) 來(lái)指定集合保存的類(lèi)型
    fallthrough
    當(dāng) Switch 程序塊直接通往下一種情況而沒(méi)有 Break 時(shí)的警告
    path
    在類(lèi)路徑、源文件路徑等中有不存在的路徑時(shí)的警告
    serial
    當(dāng)在可序列化的類(lèi)上缺少 serialVersionUID 定義時(shí)的警告
    finally
    任何 finally 子句不能正常完成時(shí)的警告
    all
    關(guān)于以上所有情況的警告
    通過(guò)上面的表格,你應(yīng)該了解到每個(gè)參數(shù)的用意了,下面我就以一個(gè)常用的參數(shù)unchecked為例,為你展示如何使用@SuppressWarnings注釋?zhuān)纠a如下:
    import java.util.List;
    import java.util.ArrayList;
    public class SuppressWarningsDemo {
            public static List cache = new ArrayList();
            //@SuppressWarnings(value = "unchecked")
            public void add(String data) {
                cache.add(data);
            }
    }
    當(dāng)我們不使用@SuppressWarnings注釋時(shí),編譯器就會(huì)有如下提示:
    注意:SuppressWarningsDemo.java 使用了未經(jīng)檢查或不安全的操作。
    注意:要了解詳細(xì)信息,請(qǐng)使用 -Xlint:unchecked 重新編譯。
    下面我們?nèi)サ?#64;SuppressWarnings(value="unchecked")這一行的注釋符“//”,它會(huì)屏蔽編譯時(shí)的警告信息,這也就是它所要達(dá)到的目的。
           另外,由于@SuppressWarnings注釋只有一個(gè)參數(shù),并且參數(shù)名為value,所以我們可以將上面一句注釋簡(jiǎn)寫(xiě)為@SuppressWarnings("unchecked");
    同時(shí)參數(shù)value可以取多個(gè)值如:@SuppressWarnings(value={"unchecked", "deprecation"})
    或@SuppressWarnings({"unchecked", "deprecation"})。
    自定義Annotation注釋
    1、注釋annotation與接口的異同:
    因?yàn)閍nnotation類(lèi)型是一個(gè)非凡的接口,所以它與接口之間存在著某些差異:
    A.       Annotation類(lèi)型使用關(guān)鍵字@interface而不是interface,這個(gè)關(guān)鍵字聲明隱含了一個(gè)信息,它是繼承了java.lang.annotation.Annotation接口,并非聲明了一個(gè)interface。
    B.        Annotation類(lèi)型的方法定義是獨(dú)特的、受限制的,方法必須聲明為無(wú)參數(shù)、無(wú)異常拋出的。這些方法定義了annotation的成員:方法名成為了成員名,而方法返回值成為了成員的類(lèi)型。而方法返回值類(lèi)型必須為primitive類(lèi)型、Class類(lèi)型、枚舉類(lèi)型、annotation類(lèi)型或者由前面類(lèi)型之一作為元素的一維數(shù)組。方法的后面可以使用default和一個(gè)默認(rèn)數(shù)值來(lái)聲明成員的默認(rèn)值,null不能作為成員默認(rèn)值,這與我們?cè)诜莂nnotation類(lèi)型中定義方法有很大不同。
    C.       Annotation類(lèi)型又與接口有著近似之處,它們可以定義常量、靜態(tài)成員類(lèi)型(比如枚舉類(lèi)型定義)。Annotation類(lèi)型也可以如接口一般被實(shí)現(xiàn)或者繼承。
    2、自定義注釋的實(shí)例:
    下面,我們將看到如何定義annotation類(lèi)型的例子。它展示了annotation類(lèi)型聲明以及@interface與interface之間的不同:
    import java.lang.annotation.*;
    /**
    使用annotation來(lái)描述那些被標(biāo)注的成員是不穩(wěn)定的,需要更改
    */
    public @interface Unstable {
    }
    下面的另一個(gè)例子只定義了一個(gè)成員。并通過(guò)將這個(gè)成員命名為value,使我們可以方便的使用這種annotation的快捷聲明方式:
    /**
    使用Author這個(gè)annotation定義在程序中指出代碼的作者
    */
    public @interface Author {
         /** 
    返回作者名 */
         String value();
    }
    以下的例子更加復(fù)雜。Reviews annotation類(lèi)型只有一個(gè)成員,但是這個(gè)成員的類(lèi)型是復(fù)雜的:由Review annotation組成的數(shù)組。Review annotation類(lèi)型有3個(gè)成員:枚舉類(lèi)型成員grade、表示Review名稱(chēng)的字符串類(lèi)型成員Reviewer、具有默認(rèn)值的字符串類(lèi)型成員 Comment。
    /**
    * Reviews annotation
    類(lèi)型只有一個(gè)成員,
    但是這個(gè)成員的類(lèi)型是復(fù)雜的:由Review annotation組成的數(shù)組
    */
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Reviews {
        Review[] value();
    }
    /**
    * Review annotation
    類(lèi)型有3個(gè)成員: 
    枚舉類(lèi)型成員grade
    表示Review名稱(chēng)的字符串類(lèi)型成員Reviewer
    具有默認(rèn)值的字符串類(lèi)型成員Comment
    */
    public @interface Review {
        // 
    內(nèi)嵌的枚舉類(lèi)型
         public static enum Grade { EXCELLENT, SATISFACTORY, UNSATISFACTORY };
         // 
    下面的方法定義了annotation的成員
         Grade grade();
         String reviewer();
         String comment() default "";
    }
    最后,我們來(lái)定義一個(gè)annotation方法用于羅列出類(lèi)運(yùn)行中所有的unchecked異常。這個(gè) annotation類(lèi)型將一個(gè)數(shù)組作為了唯一的成員。數(shù)組中的每個(gè)元素都是異常類(lèi)。為了加強(qiáng)對(duì)未檢查的異常(此類(lèi)異常都是在運(yùn)行時(shí)拋出)進(jìn)行報(bào)告,我們可以在代碼中對(duì)異常的類(lèi)型進(jìn)行限制:
    public @interface UncheckedExceptions { 
         Class<? extends RuntimeException>[] value();
    }
    Meta-Annotation類(lèi)型
    Annotation 類(lèi)型可以被它們自己所標(biāo)注。Java5.0定義了4個(gè)標(biāo)準(zhǔn)的meta-annotation類(lèi)型,分別是:Target、Retention、Documented、Inherited,它們被用來(lái)提供對(duì)其它annotation類(lèi)型作說(shuō)明。 這些類(lèi)型和它們所支持的類(lèi)在java.lang.annotation包中可以找到。
    @Target的用法:指示注釋類(lèi)型所適用的程序元素的種類(lèi)。如果注釋類(lèi)型聲明中不存在 Target 元注釋?zhuān)瑒t聲明的類(lèi)型可以用在任一程序元素上。如果存在這樣的元注釋?zhuān)瑒t編譯器強(qiáng)制實(shí)施指定的使用限制。例如,以下這個(gè)注釋只能用來(lái)聲明方法
    @Target(ElementType.METHOD)
        public @interface MyAnnotation {
            ... 
        }
    java.lang.annotation.ElementType是一個(gè)枚舉類(lèi)型,它具有以下定義:
    ElementType
    說(shuō)明
    ElementType.ANNOTATION_TYPE
    應(yīng)用于注釋類(lèi)型聲明
    ElementType.CONSTRUCTOR
    構(gòu)造方法聲明
    ElementType.FIELD
    應(yīng)用于字段聲明(包括枚舉常量)
    ElementType.LOCAL_VARIABLE
    應(yīng)用于局部變量聲明
    ElementType.METHOD
    應(yīng)用于方法聲明
    ElementType.PACKAGE
    應(yīng)用于包聲明
    ElementType.PARAMETER
    應(yīng)用于參數(shù)聲明
    ElementType.TYPE
    應(yīng)用于類(lèi)、接口(包括注釋類(lèi)型)或枚舉聲明
     @Retention的用法指示注釋類(lèi)型的注釋要保留多久。如果注釋類(lèi)型聲明中不存在 Retention 注釋?zhuān)瑒t保留策略默認(rèn)為 RetentionPolicy.CLASS,例如:
    @ Retention(RetentionPolicy.CLASS)
        public @interface MyAnnotation {
            ... 
        }
           java.lang.annotation.RetentionPolicy是一個(gè)枚舉類(lèi)型,它具有以下定義:
    RetentionPolicy
    說(shuō)明
    RetentionPolicy.CLASS
    編譯器將把注釋記錄在類(lèi)文件中,但在運(yùn)行時(shí) VM 不需要保留注釋
    RetentionPolicy.RUNTIME
    編譯器將把注釋記錄在類(lèi)文件中,在運(yùn)行時(shí) VM 將保留注釋?zhuān)虼丝梢苑瓷湫缘刈x取
    RetentionPolicy.SOURCE
    編譯器要丟棄的注釋
    @Documented的用法:指示某一類(lèi)型的注釋將通過(guò) javadoc 和類(lèi)似的默認(rèn)工具進(jìn)行文檔化。應(yīng)使用此類(lèi)型來(lái)注釋這些類(lèi)型的聲明:其注釋會(huì)影響由其客戶(hù)端注釋的元素的使用。如果類(lèi)型聲明是用 Documented 來(lái)注釋的,則其注釋將成為注釋元素的公共 API 的一部分。Documented是一個(gè)沒(méi)有成員的注釋。
    @Inherited的用法:指示注釋類(lèi)型自動(dòng)被子類(lèi)繼承。 Inherited是一個(gè)沒(méi)有成員的注釋。
    注意,如果使用@Inherited注釋類(lèi)以外的任何事物都是無(wú)效的。還要注意,此元注釋僅對(duì)從超類(lèi)繼承注釋有效;對(duì)已實(shí)現(xiàn)接口的注釋無(wú)效。
    posted @ 2010-08-04 10:22 第七日 閱讀(383) | 評(píng)論 (0)編輯 收藏

    2007年1月5日 #

    怎么用 javascript 做數(shù)據(jù)的格式化

    ?

    作者:老 K

    ???????? 我們?cè)陧?xiàng)目中都有用過(guò)金額數(shù)字及日期等數(shù)據(jù)格式化輸出顯示,比如前面加上“¥”,數(shù)值取小數(shù)點(diǎn)后兩位,短日期時(shí)間等。一般的高級(jí)語(yǔ)言及開(kāi)發(fā)工具都有提供相應(yīng)的轉(zhuǎn)換函數(shù)如 format 之類(lèi),可是我在最近做 web 網(wǎng)上銀行相關(guān)的系統(tǒng)時(shí),卻遇到這個(gè)很麻煩的問(wèn)題,就是 javascript 不提供這種 format 函數(shù),查了些資料,知道 vbscript 是有格式化函數(shù)的,可是 vbscript 是微軟專(zhuān)用的,無(wú)奈只好用正則表達(dá)式,可正則表達(dá)式也不能夠很通用地解決各種類(lèi)型轉(zhuǎn)換問(wèn)題,真的是很郁悶,無(wú)意中找到看到一個(gè) AJAX 開(kāi)發(fā)工具的演示(工具下載地址是點(diǎn)擊鏈接),看到它的數(shù)據(jù)有顯示“¥”和數(shù)值小數(shù)點(diǎn)后兩位格式化,馬上下載了看了下,發(fā)現(xiàn)它居然是用 javascript+XSL 實(shí)現(xiàn)了通用的格式化函數(shù),下載 AJAX WebShop 后,我找到它的 system.js 這個(gè)文件,打開(kāi)找到以下函數(shù):

    function FormatFloat(value,mask)

    {

    ???????? return BasicFormat(value,mask,'FormatNumber')

    }

    function FormatDate(varDate, bstrFormat, varDestLocale)

    {

    ???????? return BasicFormat(varDate,bstrFormat,'FormatDate',varDestLocale);

    }

    function FormatTime(varTime, bstrFormat, varDestLocale)

    {

    ???????? return BasicFormat(varTime,bstrFormat,'FormatTime',varDestLocale);

    }

    function BasicFormat(value,mask,action,param)

    {

    ???????? var xmlDoc;

    ???????? var xslDoc;

    ???????? var v=''+value+''+mask+'';

    ???????? xmlDoc=parseXML(v);

    ?

    ???????? var x;

    ???????? if(isIE)

    ?????????????????? x=''

    ???????? else

    ?????????????????? x='';

    ???????? x+='';

    ???????? if(isIE) {

    ?????????????????? x+=''+action+'('+value+',"'+mask+'"';

    ?????????????????? if(param)x+=','+param;

    ?????????????????? x+=')';

    ???????? }

    ???????? else

    ?????????????????? x+='';

    ?

    ???????? x+='';

    ???????? xslDoc=parseXML(x);

    ???????? var s;

    ???????? if(isIE)

    ???????? ?s= xmlDoc.transformNode(xslDoc)

    ???????? else{

    ?????????????????? //for mozilla/netscape

    ??????? var processor = new XSLTProcessor();

    ?????????????????? processor.importStylesheet(xslDoc);

    ?????????????????? var result = processor.transformToFragment(xmlDoc, xmlDoc);

    ??????? var xmls = new XMLSerializer();

    ??????? s = xmls.serializeToString(result);

    ???????? }

    ???????? return s;

    }

    看來(lái)他們對(duì) xsl 用得可真是出神入化了,居然這樣就可以實(shí)現(xiàn)很通用的格式化轉(zhuǎn)換了,當(dāng)然不客氣了,直接加到我的函數(shù)庫(kù)中哈。

    ???????? 這個(gè)代碼偶沒(méi)有看得很懂,不過(guò)確實(shí)很管用,請(qǐng)對(duì) XSL 精通的朋友分析下也好讓我們學(xué)習(xí)下。

    posted @ 2007-01-05 09:22 第七日 閱讀(973) | 評(píng)論 (1)編輯 收藏

    僅列出標(biāo)題  
    主站蜘蛛池模板: 久九九精品免费视频| 亚洲日韩中文字幕天堂不卡| 国产成人亚洲影院在线观看| 最新国产AV无码专区亚洲| 久久精品国产69国产精品亚洲 | 成人毛片18岁女人毛片免费看| 成年女人色毛片免费看| 又粗又大又猛又爽免费视频| 91免费国产精品| 午夜福利不卡片在线播放免费| 韩国免费三片在线视频| 色噜噜亚洲精品中文字幕| 亚洲视频在线观看| 亚洲小说图区综合在线| www成人免费观看网站| 麻豆成人久久精品二区三区免费| 中文字幕人成无码免费视频| 国产成人免费a在线视频app| 亚洲精品V欧洲精品V日韩精品| 亚洲丰满熟女一区二区v| 久久亚洲AV无码精品色午夜麻豆 | 免费一级毛片无毒不卡| 91嫩草国产在线观看免费| 亚洲精品无码专区久久同性男| 亚洲网站在线免费观看| j8又粗又长又硬又爽免费视频| 37pao成人国产永久免费视频| 免费在线观看a级毛片| 亚洲美女一区二区三区| 免费一级全黄少妇性色生活片 | 中国videos性高清免费| 卡1卡2卡3卡4卡5免费视频| 久久精品国产亚洲综合色| 亚洲成a人无码亚洲成av无码 | 国色精品卡一卡2卡3卡4卡免费 | 亚洲国产精品无码久久一线| 亚洲一区二区三区成人网站 | 国内精品免费久久影院| 免费黄网在线观看| 久久久久亚洲AV无码专区首JN| 一道本不卡免费视频|