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

分享

Tiger系列四:Annotation第二部分:定制Annotation

 web.anywhere 2006-03-16
作者:http://blog.csdn.net/chenyun2000/archive/2005/02/05/281824.aspx
1
、自定義Annotation類型

1)定義Annotation類型

l         使用@interface聲明Annotation類型

public @interface InProgress {
 
}

l         使用Annotation類型

public class TestAnnotation {
       @InProcess
       public void test() {
         
       }
}

l         如果Annotation類型和使用它的類不在相同的包中,可以import Annotation類型,以便直接使用 @InProgress

2)添加成員

l         Annotation類型可以有成員變量,以提供有用的信息

l         定義數(shù)據(jù)成員不需要定義gettersetter方法,只需要定義一個(gè)以成員名稱命名的方法,并指定返回類型為需要的數(shù)據(jù)類型

l         簡(jiǎn)單的例子:

public @interface TODO {
       String value();
}

l         使用帶成員的Annotation類型:

public class TestAnnotation {
       @InProcess
       @TODO("Need to finish this method later")
       public void test() {
         
       }
}

3)設(shè)置缺省值

l         要為Annotation類型的成員設(shè)置缺省值,需要在聲明成員時(shí)使用default關(guān)鍵字:

public @interface GroupTODO {
       public enum Severity {
              CRITICAL, IMPORTANT, TRIVIAL, DOCUMENTATION
       };
 
       Severity severity() default Severity.IMPORTANT;
       String item();
       String assignedTo();
       String dateAssigned();
}

l         當(dāng)然,缺省值的類型必須與成員變量聲明的類型完全相同

l         下面是使用缺省值的例子:

public class TestAnnotation {
       @InProcess
       @GroupTODO(
              item="Need to finish this method later",
              assignedTo="nelson_tu",
              dateAssigned="2005/02/05"
       )
       public void test() {
         
       }
}

l         下面是改寫缺省值的例子:

public class TestAnnotation {
       @InProcess
       //@TODO("Need to finish this method later")
       @GroupTODO(
              severity=GroupTODO.Severity.DOCUMENTATION,
              item="Need to finish this method later",
              assignedTo="nelson_tu",
              dateAssigned="2005/02/05"
       )
       public void test() {
         
       }
}

 

2、元Annotation

l         Annotation就是AnnotationAnnotationJDK5提供了4種預(yù)定義的元Annotation

1@Target

l         @Target指定Annotation類型可以應(yīng)用的程序元素,以便在其它程序元素中誤用Annotation類型

l         程序元素的類型由java.lang.annotation.ElementType枚舉類定義:

package java.lang.annotation;
 
public enum ElementType {
  TYPE,          // Class, interface, or enum (but not annotation)
  FIELD,         // Field (including enumerated values)
  METHOD,        // Method (does not include constructors)
  PARAMETER,             // Method parameter
  CONSTRUCTOR,           // Constructor
  LOCAL_VARIABLE, // Local variable or catch clause
  ANNOTATION_TYPE,       // Annotation Types (meta-annotations)
  PACKAGE        // Java package
}

l         下面是使用@Target的例子:

@Target({ElementType.TYPE,
    ElementType.METHOD,
    ElementType.CONSTRUCTOR,
    ElementType.ANNOTATION_TYPE})
public @interface TODO {
       String value();
}

2@Retention

l         @Retention Java 編譯器處理Annotation類型的方式有關(guān)

l         這些方式由java.lang.annotation.RetentionPolicy 枚舉類定義:

package java.lang.annotation;
 
public enum RetentionPolicy {
  SOURCE,       // Annotation is discarded by the compiler
  CLASS,       // Annotation is stored in the class file, but ignored by the VM
  RUNTIME       // Annotation is stored in the class file and read by the VM
}

l         使用@Retention的例子參看后面的@Documented

3@Documented

l         @Documented指明需要在Javadoc中包含Annotation(缺省是不包含的)

l         下面是一個(gè)使用@Documented的例子:

@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface InProcess {
 
}

l         使用@Documented的一個(gè)技巧就是指定保持性策略為RetentionPolicy.RUNTIME:這樣,Annotation就會(huì)保留在編譯后的類文件中并且由虛擬機(jī)加載,然后Javadoc就可以抽取出Annotation,添加到類的HTML文檔中

4@Inherited

l         @Inherited最復(fù)雜、使用最少、也最容易造成混淆的一個(gè)

l         假設(shè)使用@InProgress 標(biāo)記一個(gè)正在開發(fā)的類,只要正確應(yīng)用@DocumentedAnnotation信息就會(huì)出現(xiàn)在Javadoc中;現(xiàn)在要編寫一個(gè)新類,擴(kuò)展那個(gè)正在開發(fā)的類,那么使用子類,或者查看它的文檔,根本沒法表明還有什么地方?jīng)]有完成;而本來是希望@InProgress Annotation信息會(huì)被帶到子類中,這就需要使用@Inherited

l         下面是這樣的例子:

@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface InProcess {
 
}

 


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(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)遵守用戶 評(píng)論公約

    類似文章 更多