study annotation

Annotation JDK1.5 新增加的功能,因工作需要有所接触,以下是自己的理解和学习。

Annotation现在应用的非常广泛,常见的说法是模版代码(个人的理解就是接口和实现,也就是说所有的子类都继承统一的接口,实现接口中定义的方法)是使用Annotation的一个例子,呵呵,看了一下,感觉不是很明白,但自己感觉除了人云亦云的好处之外,自己感觉到的好处就是一个方法在拥有了Annotation之后,Annotation就能动态地描述方法的功能了,比如在写JUNITUNIT TEST CASE时,

原先的方式是TEST CLASS继承自TestCase类,覆盖setup()teardown()方法,所有的测试方法必须以test作为prefix

现在的方式是TESTCLASS不必强制继承TestCase类,原先的setup()方法被@Before标记代替,方法名也就可以任意定义了,这个标记已经说明这个方法会在每个测试方法执行前执行;类似,teardown()方法被@After方法替代,以test作为prefix的测试方法用@Test替代,方法名也可任意了。

 

呵呵,说了一堆,是不是真的有好处呢,现在所看到的也就是类不再受TestCase的约束了,方法名不再被基类限制,可以随便起名而已。真的还有的别的非常神奇的地方吗?

 

我本来的期望是 难道能让类与JUNIT的类库解耦?但仔细一想不对吧,虽然可以不再和TestCase类耦合,但里面用的Annotation标志也是JUNIT中定义的呀,还是没啥用呀!好像大家还有一个常用的地方,比如很多的时候,我们写了一些类,要根据这些类去写相应的配置文件,如果用Annotation的话,这一过程也就可以自动化一些,而且不会让配置和原类进行分离,也就是说原先他们本应该有些内聚的关系的,手工的书写,让他们表明上看不到有什么关联,但实际上是不能互相脱离的,采用了Annotation就增加这种关联性。

 

先把它的作用放一边,学习一下它的定义和使用先

 

Annotation使用@interface声明,看起来特像interface,这和我的理解差不多,就像是替代interface似的,确实是起到了接口的作用,但是比interface灵活,不必继承接口,不必实现所有接口中的方法,就像把接口中的每个方法都拆分到了一个独立的接口中。

 

就像定义一个类和接口一样去定义一个Annotation,定义Annotation时最重要的用来描述这个新Annotation的三个Annotation,一个是@Documented,一个是@Target,一个是@Retention,

它们是JDK内置的,主要就是用来定义新的Annotation,就像Object类一样.它们的作用分别是

              I.      @Retention表明定义的Annotation的存在范围,它用了一个EnumRetentionPolicy)来标明它的存在范围,

                                                               i.            如果是RetentionPolicy.SOURCE的话,就表明此Annotation只存在于源代码中,在编译之后是不会存在于class文件中的,这种方式主要用于编译时的检查;

                                                             ii.            RetentionPolicy.CLASS表明Annotation不仅会存在于源代码中,也会存在于CLASS文件中,但在运行时的VM中是没有相关信息的,JAVA中默认的就是这种方式;

                                                            iii.            RetentionPolicy.RUNTIME表明此Annotation不光编译后存在于CLASS文件中,而且在运行时的VM中也是存在的,可以被读取。

            II.      @Target表明新定义的Annotation能够被使用的范围(因为Annotation是属于修饰符,所以有其使用范围,就像final不能用来修饰接口,这里就用Target来指明),也使用了一个枚举来声明其范围――ElementType,

TYPE:指类,接口(包括Annotation)以及枚举

FIELD:就是指field,类变量(叫属性也许更清晰一些),不含局部变量,也包括枚举中的常量

METHOD:指方法

PARAMETER:参数

CONSTRUCTOR:构造函数

LOCAL_VARIABLE:局部变量

ANNOTATION_TYPEAnnotation类型专用

PACKAGEpackage专用

          III.      @Documented表明此Annotation在被使用时,可不可以被JAVADOC导出

JDK中内置的@Target Annotation的源码如下,表明它只能用Annotation类型,在运行时也能取到这个Annotation的信息,并且Annotation信息可以被导出到JDOC文档中。

package java.lang.annotation;

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.ANNOTATION_TYPE)

public @interface Target

{

    ElementType[] value();

}

 

上面的步骤声明了一个Annotation,只是一个标记性的Annotation,还没有参数,可以进一步为Annotation增加参数,例如上面的@Target例子。Annotation的参数声明完全类似于Interface中的方法,咋看起来只是一个没有方法体的方法声明,但是还有一些其它的限制:

  1. 参数类型的限制,只能使用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String.
  2. 如果只有一个参数成员,最好把参数名称设为value,例如上面的@Target例子(此时使用时就可以不用写成参数名=参数值,而只需要在括号内写参数值)
  3. 如果参数有默认值,要在方法的分号前面写上default 参数值,如下

@Documented

@Inherited

@Target({ElementType.METHOD,ElementType.CONSTRUCTOR})

@Retention(value = RetentionPolicy.RUNTIME)

public @interface FirstSampleAnnotation

{

      int size() default 4;

      String name() default "hehe";

}

Annotation的使用方法很简单,因为它只是一般的修饰符,所以它和其它的修饰符的使用差不多,可以直接写在相应类似的前面,如果Annotation有参数的话,在后面加上括号然后是参数名=参数值,如果有多个参数用分号隔开。

上面自定义的Annotation的使用如下:

public class UseAnnotationSuper

{

      private String fname = null;

      private String lname = null;

     

      @FirstSampleAnnotation(size=4,name="oh,")

      public void setFname(String temp)

      {

            fname = temp;

      }

}

如何应用上面自定义的Annotation,

一是可以用于信息提取,就如同JAVADOC一样

二是标记性处理如同JUNIT4中的@Test @After

二是运行时信息检查,比如上面的例子中就可以在运行时,反射调用时,根据annotation进行检查或别的处理。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值