歡迎您光臨本站 註冊首頁

Annotation之ElementType.PACKAGE

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

Annotation的出現,給優美的Java再添加了更廣闊的空間,讓你可以設計出更加完美,更加嘆為觀止的程序.

項目關係,用到了這個東東在滿天下泛濫的ElementType.TYPE,ElementType.METHOD現在,Google下,就可以發現,用ElementType.PACKAGE真的少得可憐.

正因為如此,寫下此日誌,給有需要的人一些參考--有關ElementType.PACKAGE

之前還是溫習下ElementType的其它各個元素

ElementType.TYPE (class, interface, enum)

ElementType.FIELD (instance variable)

ElementType.METHOD

ElementType.PARAMETER

ElementType.CONSTRUCTOR

ElementType.LOCAL_VARIABLE

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);

}

}

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

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


[火星人 ] Annotation之ElementType.PACKAGE已經有435次圍觀

http://coctec.com/docs/java/show-post-60925.html