Annotation之ElementType.PACKAGE

Annotation之ElementType.PACKAGE

    Annotation的出現,給優美的Java再添加了更廣闊的空間,讓你能夠設計出更加完美,更加歎爲觀止的程序。 java

    項目關係,用到了這個東東在滿天下氾濫的ElementType.TYPE,ElementType.METHOD如今,Google下,就能夠發現,用ElementType.PACKAGE真的少得可憐。 spa

    正由於如此,寫下此日誌,給有須要的人一些參考--有關ElementType.PACKAGE .net

    以前仍是溫習下ElementType的其它各個元素 設計

    ElementType.TYPE (class, interface, enum) 日誌

    ElementType.FIELD (instance variable) 接口

    ElementType.METHOD ip

    ElementType.PARAMETER get

    ElementType.CONSTRUCTOR 源碼

    ElementType.LOCAL_VARIABLE it

    ElementType.ANNOTATION_TYPE (應用於另外一個註解上)

    ElementType.PACKAGE

    當一個Annotation接口被聲明爲

    @Target(value=ElementType.PACKAGE)時,它便是對包的修飾註釋,看下面的例子

    package com.xu.ycoe.navigator;

    import java.lang.annotation.Documented;

    import java.lang.annotation.ElementType;

    import java.lang.annotation.Retention;

    import java.lang.annotation.RetentionPolicy;

    import java.lang.annotation.Target;

    @Target(value={ElementType.PACKAGE,ElementType.TYPE,ElementType.METHOD})

    @Retention(RetentionPolicy.RUNTIME)

    @Documented

    public @interface Navigator{

    public String name();

    public String values();

    }

    代碼裏用到的除了ElementType.PACKAGE,其它的都很熟悉了吧,再也不多說,不明的,本身Google下

    上面定義了一個可在包、類、接口、方法中使用的Annotation

    通常狀況下,是這樣應用的:

    @Navigator(name="package",values="我在包裏")

    package com.xu.ycoe.navigator;

    @Navigator(name="class",values="我在類裏")

    public class NavigateManager {

    @Navigator(name="method",values="我在方法裏")

    public void Test(){}

    }

    OK,可是在Eclipse下會出現一個錯誤:Package annotations must be in file package-info.java可鬱悶透了,在Eclipse下,沒法直接建立package-info.java類,緣由是類名不合法,暈哦~~~ 只好強行建立了,使用Eclipse下的新建文件(任意文本文件,把文件名改成package-info.java便可)

    文件的內容以下:

    @Navigator(name="package", values="我在包裏") package com.xu.ycoe.navigator;

    //若是這個包與Annotation不在同一包下時要import進來Annotation的包

    import com.xu.ycoe.navigator.Navigator;好啦,包的註釋是不能放在某一個類裏面的,而是要在此包下面新建一個package-info.java文件,在那裏面寫註釋

    OK,一切就序,沒有報錯了。

    下面看看怎樣使用吧。

    其實很簡單,直接使用java.lang.Package類就能夠了,和類、方法中的Annotation使用徹底同樣。

    Package p = Package.getPackage("com.xu.ycoe.navigator");

    if(p!=null && p.isAnnotationPresent(Navigator.class)){

    Navigator nav = p.getAnnotation(Navigator.class);

    if(nav !=null){ System.out.println(nav.values()+"======================="+nav.name());

    }

    }

    可是有一個地方要注意一下,Java的包不是一會兒所有一塊兒加載,而是在使用到的時候纔去加載的。

    這樣,在使用Package.getPackage(String name)的時候,若是這個包下的類尚未被加載過,就會直接返回一個null值。緣由嘛,看看java源碼:

    Code

    public static Package getPackage(String name){

    ClassLoader l = ClassLoader.getCallerClassLoader();

    if (l != null) { return l.getPackage(name);

    } else {

    return getSystemPackage(name);

    }

    }

    好了,這一點注意一下就沒什麼問題了。

    比較粗糙,大概仍是說明白了怎樣使用

相關文章
相關標籤/搜索