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); } } 好了这一点注意一下就没什么问题了 比较粗糙大概还是说明白了怎样使用 |