回!认识一下强大的Annotation
来!认识一下强大的Annotation转自:http://snkcxy.iteye.com/blog/1820951?1.annotation是什么?注释:存在与
来!认识一下强大的Annotation
转自:http://snkcxy.iteye.com/blog/1820951
?
1.annotation是什么?
注释:存在与否都不会影响程序的运行,当然这个是指不涉及APT(Annotation Processing Tool)的情况下标记:可以标记类、方法、成员变量(java 8开始可以标记类型)补充信息:可以具体描述被标记内容的相关信息,提供验证、部署、额外的功能。一个简单又复杂的强大技术。
2.我们身边的Annotation
@Override:可以认为是一种验证,验证所标记的方法是否是父类的需要重写的方法,主要防止低级错误(例如拼写错误),它告诉编译器来验证这个方法,保证你所重写的方法是父类存在的方法。(有些人认为这是一种限定或者是控制)@Deprecated:标记这个方法已经过时。 例如:我们自己定义一个过时的方法,或者创建一个Date对象 然后调用getYear()方法Spring、Hibernate、各种MVC框架,现在都基本提供Annotation的编程方式。
优点:简单(降低配置难度),提高开发效率(不用来回切换于代码与配置文件之间)
缺点:在没有源码的情况下 今后维护起来比较费劲,修改代码之后大部分情况下不得不重启服务。
? ? ? ?
?
3.写一个简单的annotation 感官认识一下,详细介绍请关注我博客的后期文章
我们自己定义了一个CxyAnnotation我们创建了一个成员变量name,然后标记上CxyAnnotation我们使用反射将其信息取出来。(当然实际使用的时候会使用APT去处理,这里只做一个简单的例子)
4.因为Annotation的使用和反射息息相关,所以本例只是简单的介绍了一下annotation,如果本文受大家欢迎的话,会尽快出更详细的文章。
?
?
?


package?com.cxy.annotation; ????import?java.lang.annotation.Annotation; ??import?java.lang.annotation.ElementType; ??import?java.lang.annotation.Retention; ??import?java.lang.annotation.RetentionPolicy; ??import?java.lang.annotation.Target; ??import?java.util.Date; ????/** ??*?@author?cxy ??*/??public?class?AnnotationTest ??{ ??????@CxyAnnotation(title="名字",descript="记录用户姓名") ??????public?String?name=""; ?????? ??????public?static?void?main(String[]?args)?throws?Exception ??????{ ??????????Date?d=new?Date(); ??????????d.getYear();?//这个Date方法被划伤了横线?代买这个方法已经过时 ??????????oldMethod();?//这个自定义的方法?被打上了过时方法的标记?@Deprecated ??????????System.out.println("===================="); ?????????? ??????????Annotation[]?aArray=AnnotationTest.class.getField("name").getAnnotations(); ??????????//为了演示方便这里我知道肯定会有一个CxyAnnotation在数组的第一个?所以直接取,实际工作中请使用遍历去判断 ??????????Annotation?na=aArray[0];?? ??????????System.out.println("成员变量name的扩展信息:"); ??????????System.out.println("name代表:"+((CxyAnnotation)na).title()); ??????????System.out.println("name具体描述:"+((CxyAnnotation)na).descript()); ??????} ?????? ??????//检查父类是否有一个这样的方法让子类重写。 ??????@Override??????public?String?toString() ??????{ ??????????return?"AnnotationTest?[getClass()="?+?getClass()?+?",?hashCode()="??????????????????+?hashCode()?+?",?toString()="?+?super.toString()?+?"]"; ??????} ????????//标记这个方法已经过时 ??????@Deprecated??????public?static?void?oldMethod() ??????{ ??????????System.out.println("这个方法已经过时了"); ??????} ??} ????//自己定义的一个Annotation ??@Retention(RetentionPolicy.RUNTIME)?//保留注释到程序运行 ??@Target(ElementType.FIELD)?//这个annotation是标记在field上的 ??@interface?CxyAnnotation ??{ ??????String?title(); ??????String?descript(); ??}??