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

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

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

    Picses' sky

    Picses' sky
    posts - 43, comments - 29, trackbacks - 0, articles - 24

    J2SE5.0新特性示例---元數據(zz)

    Posted on 2007-08-07 13:32 Matthew Chen 閱讀(294) 評論(2)  編輯  收藏 所屬分類: Java SE

    J2SE 5.0通過引入注釋(Annotation)的概念添加了對元數據的支持。

    一個@xxx形式的注釋可以當成一個修飾符來使用,它可以放在任何一個修飾符可以出現的地方。public,static,final都是java語言的修飾符,注釋可以寫在它們可以出現的任何地方。

    舉個例子,可以看下面一段代碼:

    public class AnnotationExample {

        public @Override int hashCode() {

           return super.hashCode();

        }

    }

     

    在這個例子中我們使用了一個java語言API中已經有定義的注釋@Override,通過在方法hashCode()中使用這個注釋,說明了hashCode是一個覆蓋了父類方法的方法。

    至于注釋的具體含義我們在以后部分會說明。

    如果你想使用一個類,你必須首先找到它的定義,或者你自己對它進行定義。注釋也是需要定義的,隨便在代碼中插入一個@XXX之類的注釋是不能夠通過編譯的。

    一個最簡單的Annotation定義類似于接口的定義,就象下面的代碼:

    public @interface Info {

    }

     

    正如你所看到的,里面什么都沒有,但是即使是這樣,我們也可以在程序里使用它:

    public @Info String  information;

     

    這樣的一種什么都沒有定義的空注釋我們稱為標記注釋(marker annotations

    我們可以在其中添加一個成員的定義:

    public @interface Info {   

         String author();

    }

     

    這里值得注意的一點是,注釋類中方法的定義不能是私有的,如果你不在前面加public關鍵字,編譯器會默認為它是公有的。

    在添加上author的定義后,原來那種只寫了一個@Info的注釋就必須修改了,之后的注釋必須這樣寫:

    public @Info(author="myname")  void afunction() {

    }

     

    一個注釋的成員可以有默認值:

    public @interface Info {   

         String author() default "myname";

    }

     

    使用默認值有什么好處呢?我們可以重新這樣寫了:

    public @Info  void afunction() {

    }

     

    在做標記時,如果確認某個成員的值和它的默認值相同,我們就可以忽略它,而不必顯式地給每個成員賦值,這樣就減輕了代碼量。

    如果我們添加的這個成員名字叫做value的話,也就是:

    public @interface Info {   

         String value();

    }

     

    就有了另外一種注釋的用法: 我們可以直接寫出這樣的注釋@Info(“information”),而不必寫@Info(value=”information”),括號里的值會自動傳遞給value。這樣的一種注釋稱為單一值注釋(Single-value annotations

    一個注釋可以有很多類型不同的成員,這樣的一種注釋稱為完整注釋(full annotations

    一個注釋中的成員類型只能夠是原生類型,字符串,Class類型,注釋類型,枚舉類型,或者一維數組。

    假設我們現在有一個注釋定義:

    public @interface Company {

        String value();

    }

     

    現在我們希望定義另外一個注釋,這個注釋類型反映了一個人的信息:

    public @interface Person {

        public enum Gender{MALE,FEMALE};

       

        String name();

        int age();

        Company company();

        Gender gender() default Gender.MALE;

        String description() default "";

    }

     

    在程序代碼中添加這種類型的注釋時可以這么寫:

    @Person(age=23,name="MyName",gender=Person.Gender.FEMALE, company=@Company("Foo Corporation"))

     

    java.lang包中定義了三種注釋,分別是:

    n         Deprecated:和過去javadoc@deprecated含義相同

    n         Override:表示方法覆蓋了父類中的方法

    n         SuppressWarnings:使用這個注釋可以使編譯器忽略特定類型的警告信息

    具體含義可以參照api文檔。

    我們知道,注釋的引入,為java語言添加了元數據的表達方式,而元數據就是關于數據的數據。在java中,還有關于注釋的注釋,我們相應的稱之為元注釋(meta-annotations

    java中,我們可以使用4種預先定義的注釋對注釋定義進行注釋,這4種注釋是:

    n         Target:指明注釋可以在哪些代碼段中使用,以避免對注釋的誤用。

    n         Retention:說明編譯器在編譯和運行時是否忽略該種注釋

    n         Documented:說明注釋是否出現在Javadoc

    n         Inherited:當我們在一個類中使用了某種注釋,有時候會希望將來它的所有子類中都包含有該種注釋信息,如果在注釋定義中添加了@Inherited,那么這種注釋就會被調用者的子類繼承

    當我們在一個類中使用注釋定義了一系列的元數據之后,我們應該如何獲取這些元數據呢?我們通過下面的例子來說明。

    Annotation的定義仍然使用列出來的兩個,因為我們需要在獲得類文件中的注釋信息,所以必須在注釋定義中添加Retention注釋。

    首先我們定義兩個注釋,注釋Todo說明了還有什么事情需要做:

    import java.lang.annotation.Retention;

    import java.lang.annotation.RetentionPolicy;

     

    @Retention(RetentionPolicy.RUNTIME)

    public @interface Todo {

        String value();

    }

     

    注釋Author說明了一個方法或者類的定義者:

    import java.lang.annotation.Retention;

    import java.lang.annotation.RetentionPolicy;

     

    @Retention(RetentionPolicy.RUNTIME)

    public @interface Author {

        public enum Gender{MALE,FEMALE};

     

        String name();

        String email();

        Gender gender() default Gender.MALE;

    }

     

    然后我們在一個簡單的類中添加這兩種類型的注釋:

    public @Todo("delete this class") class Foo {

       

        public void methodA(){}

        public @Author(name="B",email="b@Foo.com") void methodB(){

        }

       

        public @Author(name="A",email="a@Foo.com") String  fieldA;

    }

     

    通過下面一段代碼我們可以提取相應的元數據:

    import java.lang.reflect.Method;

     

    public class GetAnnotations {

     

        public static void main(String[] args) {

           try {

               Class<?> klass=Class.forName(args[0]);

               if(klass.isAnnotationPresent(Todo.class))

               {

                  Todo t=klass.getAnnotation(Todo.class);

                  System.out.println(t);

               }

               for(Method m:klass.getMethods())

               {

                  if(m.isAnnotationPresent(Author.class))

                  {

                      Author a=m.getAnnotation(Author.class);

                      System.out.printf("Method:%s,Author:%s%n",m.getName(),a);

                  }

               }

           } catch (ClassNotFoundException e) {

              

               e.printStackTrace();

           }

        }

    }

     

     

    使用下面的命令行運行程序:

    java GetAnnotations Foo

     

    運行結果如下:

    @Todo(value=delete this class)

    Method:methodB,Author:@Author(gender=MALE, name=B, email=b@Foo.com)

     

     轉自:http://www.tkk7.com/jayliu/archive/2005/05/12/4209.html

    Feedback

    # re: J2SE5.0新特性示例---元數據(zz)  回復  更多評論   

    2007-08-10 09:39 by dreamstone
    不錯,之前只是簡單用一下deprecated override等功能

    # re: J2SE5.0新特性示例---元數據(zz)  回復  更多評論   

    2007-11-11 23:25 by 楊愛友
    注釋一般是用來給自己開發人員看的,如果沒有注釋,這個人離開公司別人很難看懂他的代碼,或過了很長時間,連自己都看不懂了,這種目的的話,我想一般用英文就OK了吧。也許有些注釋是用來生成文檔的,這時或許有要求用英文注釋吧。哈哈 沒聽說過哪個公司要求注釋用英文寫。
    主站蜘蛛池模板: 最近免费mv在线观看动漫 | 最近2019中文字幕免费直播 | 国产又大又粗又硬又长免费 | 三级毛片在线免费观看| 亚洲av无码乱码在线观看野外| 亚洲一区AV无码少妇电影| 99在线视频免费观看视频| 亚洲综合丁香婷婷六月香| 色窝窝免费一区二区三区| 亚洲午夜一区二区三区| 免费观看理论片毛片| 国产AV无码专区亚洲AV琪琪| 亚洲国产香蕉人人爽成AV片久久| 美女网站在线观看视频免费的 | 69av免费观看| 亚洲人精品亚洲人成在线| 我想看一级毛片免费的| 国内成人精品亚洲日本语音| 亚洲AV无码成人精品区大在线| jizz中国免费| 亚洲日本中文字幕| 成人黄软件网18免费下载成人黄18免费视频 | 久久九九兔免费精品6| 国产99在线|亚洲| 波多野结衣一区二区免费视频| 一个人看的免费观看日本视频www 一个人看的免费视频www在线高清动漫 | 精品亚洲成a人片在线观看少妇| 免费能直接在线观看黄的视频| 亚洲最大av资源站无码av网址| 国产一区二区三区免费看| 中文在线免费不卡视频| 亚洲伊人久久大香线蕉在观| 又爽又高潮的BB视频免费看 | 成人免费乱码大片A毛片| 亚洲视频中文字幕在线| 全免费一级午夜毛片| 一区二区三区免费电影| 亚洲午夜精品一区二区公牛电影院 | 在线免费观看你懂的| 国产成人亚洲综合在线| 亚洲AV色香蕉一区二区|