Annotation的出現給優美的Java再添加了更廣闊的空間讓你可以設計出更加完美更加歎為觀止的程序
項目關系用到了這個東東在滿天下泛濫的ElementTypeTYPEElementTypeMETHOD現在Google下就可以發現用ElementTypePACKAGE真的少得可憐
正因為如此寫下此日志給有需要的人一些參考有關ElementTypePACKAGE
之前還是溫習下ElementType的其它各個元素
ElementTypeTYPE (class interface enum)
ElementTypeFIELD (instance variable)
ElementTypeMETHOD
ElementTypePARAMETER
ElementTypeCONSTRUCTOR
ElementTypeLOCAL_VARIABLE
ElementTypeANNOTATION_TYPE (應用於另一個注解上)
ElementTypePACKAGE
當一個Annotation接口被聲明為
@Target(value=ElementTypePACKAGE)時它即是對包的修飾注釋看下面的例子
package comxuycoenavigator;
import javalangannotationDocumented;
import javalangannotationElementType;
import javalangannotationRetention;
import javalangannotationRetentionPolicy;
import javalangannotationTarget;
@Target(value={ElementTypePACKAGEElementTypeTYPEElementTypeMETHOD})
@Retention(RetentionPolicyRUNTIME)
@Documented
public @interface Navigator{
public String name();
public String values();
}
代碼裡用到的除了ElementTypePACKAGE其它的都很熟悉了吧不再多說不明的自己Google下
上面定義了一個可在包類接口方法中使用的Annotation
一般情況下是這樣應用的
@Navigator(name=packagevalues=我在包裡)
package comxuycoenavigator;
@Navigator(name=classvalues=我在類裡)
public class NavigateManager {
@Navigator(name=methodvalues=我在方法裡)
public void Test(){}
}
OK但是在Eclipse下會出現一個錯誤Package annotations must be in file packageinfojava可郁悶透了在Eclipse下無法直接創建packageinfojava類原因是類名不合法暈哦~~~只好強行創建了使用Eclipse下的新建文件(任意文本文件把文件名改為packageinfojava即可)
文件的內容如下
@Navigator(name=package values=我在包裡) package comxuycoenavigator;
//如果這個包與Annotation不在同一包下時要import進來Annotation的包
import comxuycoenavigatorNavigator;好啦包的注釋是不能放在某一個類裡面的而是要在此包下面新建一個packageinfojava文件在那裡面寫注釋
OK一切就序沒有報錯了
下面看看怎樣使用吧
其實很簡單直接使用javalangPackage類就可以了和類方法中的Annotation使用完全一樣
Package p = PackagegetPackage(comxuycoenavigator);
if(p!=null && pisAnnotationPresent(Navigatorclass)){
Navigator nav = pgetAnnotation(Navigatorclass);
if(nav !=null){ Systemoutprintln(navvalues()+=======================+navname());
}
}
但是有一個地方要注意一下Java的包不是一下子全部一起加載而是在使用到的時候才去加載的
這樣在使用PackagegetPackage(String name)的時候如果這個包下的類還沒有被加載過就會直接返回一個null值原因嘛看看java源碼
Code
public static Package getPackage(String name){
ClassLoader l = ClassLoadergetCallerClassLoader();
if (l != null) { return lgetPackage(name);
} else {
return getSystemPackage(name);
}
}
好了這一點注意一下就沒什麼問題了
比較粗糙大概還是說明白了怎樣使用
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26731.html