程序员人生 网站导航

Annotation之ElementType.PACKAGE

栏目:综合技术时间:2014-04-25 13:39:52

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源码:

public static Package getPackage(String name){
ClassLoader l = ClassLoader.getCallerClassLoader();
if (l != null) {
return l.getPackage(name);
} else {
return getSystemPackage(name);
}
}

好了,这一点注意一下就没什么问题了。

转自:http://www.cnblogs.com/ycoe/

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐