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

    }

    }

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

    比较粗糙,大概仍是说明白了怎样使用

相关文章
相关标签/搜索