- 浏览: 129217 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
feng_tai_jun:
sudo openconnect -b -u MyUserNa ...
ubuntu 下使用openconnect 连接vpn
java 自定义Annotation
- 博客分类:
- java
Annotation 注解,个人简单的理解就是加在方法,类,变量上的标记,即注解。通过Annotation可以筛选出你想要的类,方法,变量等。(纯个人理解,如果不对请指出! (∩_∩))。接下来就是重头戏自定义注解,自定义注解非常的方便,看代码:
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(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Name { String name() ; String desc() default "no description"; }
这样就定义了一个名为Name的注解了,接下来看如果使用。
public class User { @Name(name="jack",desc="the great man") public void getName(){ System.out.println("I'm user1"); } @Name(name="tom",desc="the good man") public void getName2(){ } }
很简单,接下来说明一下代码。在代码1中,
第一行@Target(ElementType.METHOD), 他代表着注解的修饰范围,类型是java.lang.annotation.ElementType枚举类型。
public enum ElementType { TYPE,//可以修饰类、接口、枚举、注解 FIELD,//可以修饰成员变量 METHOD,//可以修饰方法 PARAMETER,//可以修饰参数 CONSTRUCTOR,//可以修饰构造方法 LOCAL_VARIABLE,//可以修饰局部变量 ANNOTATION_TYPE,// 可以修饰Annotation PACKAGE//可以修饰包 }
第二行@Retention(RetentionPolicy.RUNTIME),表示注解保留的有效期
//会将注解保留到编译后的class中,加载类的时候不生效 @Retention(RetentionPolicy.CLASS) //仅仅在代码保留,编译后的class不会保留 @Retention(RetentionPolicy.SOURCE) //在编译后的class会有,通过反射也会获得注解信息 @Retention(RetentionPolicy.RUNTIME)
接下来可以通过实例进一步的理解:
实例要完成的内容:假设我定义了一个名为Component的注解,然后找到指定包下含有Component注解的类并对其初始化。
首先定义Component注解
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(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Component { String value(); }
然后分别在User1 User2中加入Component注解
@Component("user1") public class User1 { public void getName(){ System.out.println("I'm user1"); } } @Component("user2") public class User2 { public void getName(){ System.out.println("I'm user2"); } }
之后可通过Java的反射机制。获取类的Annotation
public class AnnotationTest3 { public static void main(String[] args) { Map<String,Object> map = createBean("com.use",Component.class); User1 u1 = (User) map.get("user1"); User2 u2= (User2) map.get("user2"); u1.getName(); u2.getName(); } public static Map<String,Object> createBean(String packageName,Class<? extends Annotation> annotation) { List<String> classNames = getPackageAllClassName(packageName); Map<String,Object> map = new HashMap<String,Object>(); try { for(String className : classNames){ Class clazz; clazz = Class.forName(packageName +"." + className); //此处只有注解的RetentionPolicy选为RunTime,Annotation才能被取得,因为只有RunTime才被载入Jvm if(clazz.isAnnotationPresent(annotation)){ Method method = annotation.getDeclaredMethod("value"); method.setAccessible(true);//此处不是设置让此方法可以访问,而是取消了java在访问此方法时的访问检测,可以大大提高效率 String name = (String)method.invoke(clazz.getAnnotation(annotation)); Object o = clazz.newInstance(); map.put(name, o); } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return map; } public static List<String> getPackageAllClassName(String packageName){ String classPath = getClassPath(); List<String> classNames = new ArrayList<String>(); packageName = packageName.replaceAll("[.]", "/"); String location = classPath + packageName; File packageDir = new File(location); if(packageDir.isDirectory()){ String[] fileNames = packageDir.list(); for(String name : fileNames){ if(name.endsWith(".class")){ classNames.add(name.substring(0,name.indexOf("."))); } } } return classNames; } public static String getClassPath(){ return AnnotationTest3.class.getResource("/").getPath(); } }
参考:http://docs.oracle.com/javase/1.5.0/docs/guide/language/annotations.html
http://huoyanyanyi10.iteye.com/blog/1317614
http://www.son1c.cn/show/859.html
发表评论
-
java初始化属性 (转)
2012-01-09 15:59 1214转自:http://www.cnblogs.com/miniw ... -
HashSet hashCode equals
2011-10-09 09:52 1071在使用HashSet 的时候往往需要重写他的equals和ha ... -
(转)修改eclipse中的默认maven2资源仓库保存地址(很有用的)
2011-07-11 16:52 1056转:http://blog.csdn.net/doublel/ ... -
HTTP请求头与应答头参数(转)
2011-03-19 15:50 3750HTTP请求头 Accept:浏览器 ... -
使用json必须的包
2011-02-17 15:25 1217commons-logging-1.0.4.jar ... -
搞懂java中的synchronized关键字(转)
2011-01-29 17:16 835转载:http://www.learndiary. ... -
JAVA中的指针,引用及对象的clone(转)
2011-01-29 17:04 803http://www.ibm.com/developerwor ... -
Java中static、this、super、final用法(转载)
2011-01-22 18:35 698http://developer.51cto.com/art/ ... -
JAVA对象的初始化过程
2011-01-22 17:58 763http://blog.mcuol.com/User/mcuo ... -
(转载)Java Exception处理之最佳实践
2011-01-05 18:36 672关键字: java/java编程 本文是Exception ... -
(转)异常设计----何使用异常的原则
2011-01-05 18:32 712(转)异常设计----何使用 ... -
java GC 理解(转载)
2010-12-30 08:34 909转载地址:http://hannoi200 ... -
使用JDK的javap工具,反汇编由javac编译器生成的.class文件
2010-12-16 09:15 1582用javap -c Test > Test.bc ... -
java 进行类初始化的情况
2010-12-16 09:01 827java类通过装载,连接,解析使一个类型可以被使用,如果遇到以 ... -
字符串 字符指针(1)
2010-12-14 11:42 707char *p1="abcd",*p ... -
jar命令设置jar 主类
2010-12-12 17:49 1432在类文件目录下 jar -cvfe textDeal. ... -
Java向文件中写入换行符(回车符)
2010-12-12 16:06 2057linux和unix系统的换行是"\n", ...
相关推荐
JPA、EJB、Spring零配置等等怎么使用相信各位读者都能掌握,这里主要是说如何自定义自己的注解,自己使用自定义的注解。
自定义Annotation的例子,博客地址:http://blog.csdn.net/yirentianran/article/details/52816764
Java基础复习笔记12Java自定义注解Annotation的使用
本文全面讲述了Java注解Annotation与Java自定义注解及相关内容,大家可以认真看看
使用annotationProcessor插件在编译期创建Java文件 使用在idea中 可以尝试下
java自定义 注解 annotation、标签库tag、监听listener、junit简单测试代码
针对java 初学者或者annotation 初次使用者全面地说明了annotation 的使用方法、定义 方式、分类。...annotation 应用(例如使用自定义annotation 生成javabean 映射xml 文件)还需要进一步的 研究和探讨
@Target:用于描述注解的使用范围,如果自定义注解不存在@Target,则表示该注解可以使用在任何程序元素之上。接收参数ElementType,其值如下: /**接口、类、枚举、注解**/ ElementType.TYPE /**字段、枚举的常量**/...
初学者可以通过以上的说明制作简单的annotation程序,但是对于一些高级的annotation应用(例如使用自定义annotation生成javabean映射xml文件)还需要进一步的研究和探讨。涉及到深入annotation的内容,作者将在后文...
本文针对java初学者或者annotation初次使用...初学者可以通过以上的说明制作简单的annotation程序,但是对于一些高级的annotation应用(例如使用自定义annotation生成javabean映射xml文件)还需要进一步的研究和探讨。
自定义Result,自定义Annotation的实例
java 元注解+拦截器实现自定义注解 @CmwAutoWired:自定义依赖注入 注意:注入的接口和实现类需要在同一包名下,注解的是类则无限制 @FieldAnnotation:自定义属性注解 @MethodAnnotation:自定义方法注解 @...
要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法
学习java自定义注解的小例子,处理运行时注解方法,可以结合博客学习,博客地址: http://blog.csdn.net/liuyonglei1314/article/details/59494503
本篇文章介绍了,Java Annotation(Java 注解)的实现代码。需要的朋友参考下
注解Annotation实现原理与自定义注解例子 每当你创建描述符性质的类或者接口时,一旦其中包含重复性的工 作,就可以考虑使用注解来简化与自动化该过程。 Java提供了四种元注解,专门负责新注解的创建工作
当然它也支持自定义 Java 标注。 网上很多关于 Java Annotation 的文章,看得人眼花缭乱。Java Annotation 本来很简单的,结果说的人没说清楚;弄的看的人更加迷糊。 我按照自己的思路,对 Annotation 进行了...
java注解原始代码自定义Java注释 教程如何在以下位置创建自定义Java注释的源代码
我们在项目开发过程中,可能会对一些公用方法抽成工具类进行使用。如果我们把这些方法再抽成注解的形式,在一些业务情况下是否更灵活一些呢? 示例是纯净的,只引入了需要的架包,启动后直接访问:ip:port/user/test ...
Java记录工具通过实现Java注释包来创建自定义绑定的自定义日志记录工具。