Annotation初步了解

Annotation初步了解

今天在看Tapestry代码的时候,突然想了解一下annotation到底是干什么的,有什么好处?花了3个小时的时间,从JDK API开始,大致了解了一下。

annotation实际上就是给一些特定的类和其属性,方法等加上一些注释(annotation),这些注释是以属性name,value进行设置的,这些属性在Annotation Class中以方法的形式存在,如下:
@Documented                //是否需要产生javadoc
@Target(java.lang.annotation.ElementType.METHOD)   //应用目标,这里是应用到field属性上面
@Retention(RetentionPolicy.RUNTIME)   //该策略指明该注释会被加载到jvm中,即在运行时,我们可以得到该注释的内容,另外两个策略,SOURCE, CLASS都不会加载到jvm中
public  @ interface  TestAnnoation {
    String value();   //属性value
    String time();     //属性time
}
以上为自定义的annotation,是应用在成员变量上的,使用该annotation情况如下
public   class  Test {
    @TestAnnoation(time
= " 12:30 " ,value = " 20 " )
    
public  String test(){
          System.out.println("test!");
          return null;
    };
}

可以使用java的反射来进行获取,通过:
Class cls  =  Class.forName( " Test " );
cls.isAnnotationPresent(AnnotationClass.
class ); // 判断是否存在annotation
TestAnnotation ta  =  (TestAnnotation)cls.getAnnotation(AnnotationClass. class ); // 获得AnnotationClass实例,后调用这个实例可以获得在AnnotationClass中定义的一些属性
System.out.println(ta.time());  // 输出注释time内容
System.out.println(ta.value());  // 输出注释value内容

我个人认为annotation的好处是将一些配置直接写在代码上,很直观;以前在使用hibernate的时候,PO对象和对应的mapping xml是分开的,不够直观,若是使用annotation就会很直观的看出这个对象的映射属性以及它的一些特殊属性(如lazy=true)之类的,在JPA中就把这种配置方式换成了annotation。

在JE上有很多关于使用annotation和xml的争论,我认为在小规模使用上可以使用annotation,就像JPA这种,每个PO上面都需要进行配置,即使使用XML也不能简化;而在大规模使用,如spring所维护的一些service的事务配置上避免使用annotation,因为每个service类中都需要配置,而使用AOP根据XML配置可以一下就搞定。

关于ElementType的其他属性:
TYPE(类型), FIELD(属性), METHOD(方法), PARAMETER(参数), CONSTRUCTOR(构造函数),LOCAL_VARIABLE(局部变量), ANNOTATION_TYPE,PACKAGE(包),其中的TYPE(类型)是指可以用在Class,Interface,Enum和 Annotation类型上.

你可能感兴趣的:(Annotation初步了解)