J2EE社区

苟有恒,何必三更起五更眠;
最无益,只怕一日曝十日寒.
posts - 241, comments - 318, trackbacks - 0, articles - 16

九、java1.5以上新特性-Annotation

Posted on 2011-06-06 18:12 xcp 阅读(756) 评论(0)  编辑  收藏 所属分类: review
1、Annotation 的由来
    a.不直接影响程序代码的语义,annotation可以从源文件,class文件或者以在运行时反射的多种方式读取
    b.类型标签javadoc
    c.因为property,xml的配置文件比较繁琐    

2、Annotation的定义方式
    a.Class,Interface,enum,Annotation是同级别的类标识符
    b.public @interface AnnotationTest{}    //@+interface = annotation的定义哈
       public @interface AnnotationTest2{
            String value();  //默认构造方法
       }
       public @interface AnnotationTest3{
           String value1();
       }
      public @interface AnnotationTest4{
            String[] value();
       }     
    
public @interface AnnotationTest5{
            String value1();
            String value2();
       }     

3、Annotation的使用方式
    a.@AnnotationTest 来使用就可以了;可以放在类,方法,属性上面;
    b.@AnnotationTest2("test")  == @AnnotationTest2(value="test");
    c.@AnnotationTest3(value1="test3");
    d.@AnnotationTest4({"test1","test2"}); == @AnnotationTest4(value=({"test1","test2"})
    e.@AnnotationTest5(value1="hello",value2="world")

4、jdk5.0以后自带的Annotation详解
    a.Override (重写)
    b.Deprecated (抛弃的,已过时的)
    c.SuppressWarnings(压制警告,屏蔽警告)
      SuppressWarnings("unchecked"); //屏蔽一个警告
      SuppressWarnings({"unchecked","deprecation"})//屏蔽[多个]警告     注意{key1,key2}的使用,以数组的形式存放
      
      有哪些常用的警告类型呢?
         -》unchecked,deprecration,可自定义

5、Annotation的高级特性 
    一、怎么来处理Annotation
    a.告知编译程序如何处理@Retention(重要)
        java.lang.annotation.Retention型态可以在您定自定义Annotation型态时,指示编译程序应该如何对待你的自定义的Annotation型态-->预设上编译程序会将Annotation信息留在[.class默认]档案中,但不会被java虚礼机读取,而仅用于编译程序或工具程序运行时的提示信息(目的) 
        1)本身就是一个 注释类型 Retention
        2)用一个:  RetentionPolicy value();属性 见jdk api
        3)RetentionPolicy是什么呢?它是一个枚举类型的注释保留策略:CLASS默认(编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释)、RUNTIME(编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取)、SOURCE(编译器要丢弃的注释)  
        4).例子
           @Target(value={TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})
           @Retention(value=SOURCE)    ==  @Retention(RetentionPolicy.SOURCE) //提供了一个策略类
            //就可以看出来,他主要就是压制警告,所以没有必要保存到class文件里面去
           public @interface SuppressWarnings{。。。} 
        5).RUNTIME时通过反射来得到Annotation相关的信息
        6).AnnotatedElement 就是提供反射处理annotation的接口,Class,constructor,Field,Method,Package都实现了这个接口,然后我们在反射的时候可以先得到Class,Constructor,Method等对象再通过里面继承的
getAnnotation
,getAnnotations,getDeclaredAnnotations,isAnnotationPresent方法画得到类,构造方法,方法,属性等前面的Annotation流程信息。
    
   b.限定Annotation的使用对象-@Target(重要)
         1).注释类型 Target,方法:ElementType[] value
         2).枚举 ElementType:PACKAGE[包声明],TYPE[类、接口(包括注释类型)或枚举声明],ANNOTATION_TYPE[注释类型==annotation类里面可以定义],CONSTRUCTOR[构造方法],METHOD[方法],FIELD[字段声明(包括枚举常量)]  ,LOCAL_VARIABLE[局部变量声明] ,PARAMETER[参数声明] 
         3).实例
            @Retention(RetentionPolicy.RUNTIME)
            @Target({
ElementType.TYPE,
ElementType.METHOD,ELEMENTType.FIELD})
            public @interface AnnotationTest6{
                    String value();
             }
   
    c.子类是否继承父类的Annotation-Inherited          1).注释类型 Inherited     声明的Annotation,
此元注释仅促成从超类继承注释;对已实现接口的注释无效
对接口起作用
             
@Documented
@Retention(value=RUNTIME)
@Target(value=ANNOTATION_TYPE)
public @interface Inherited 
          2).使用:如果我们在新建Annotation对象事,如果声明了
Inherited就会自动继承
,反知则不继承
          3).实例:
              @Retention(RetentionPolicy.RUNTIME)
              @
Inherited
              public @interface AnnotationTest6{String value();}
             
             @
AnnotationTest6("haha")
              public class Parent{}
   
              public class Child extends Parent{}

              然后通过反射去查Child的所有Annotation
             

    
d.利用反射得到Annotation信息[@Retention(value=RUNTIME)]
        1)用上面的实例: 
 AnnotationTest5
        2)真正解析代码: 
               public Class MyTest{
                    @AnnotationTest5(value1="hello",value2="world")
                    public void output(){
                        System.out.println("test annotation");
                    }
               }
             
               public class MyReflection{
                    public static void main(String args[]){
                             MyTest t = new MyTest();
                            Class<MyTest> c = MyTest.class;
                            Class<
AnnotationTest5> a = AnnotationTest5.class;
                            Method m = c.getMethod("output",new Class[]{});
                            if(m.isAnnotationPresent(a)){
                                    m.invoke(t,new Object[]{});
                                    //Annotation a1 = m.getAnnotation(a);
                                    MyAnnotationTest5 t5 =  
m.getAnnotation(a);
                                    System.out.println(t5.value1);
                                    System.out.println(t5.value2);
                              }

                              Annotation[] ans = m.getAnnotations();
                              for(Annotation an : ans){
                                 System.out.println(an.annotationType().getName());   //但这就要看Annotation选择的那种生成策略:SOURCE,CLASS,RUNTIME[SuppressWarnings就不会显示出来]
                              }
                    }
                }
6、应用
    a.javadoc
         1)注释类型 Documented
         2)实例:一般我们产生javadoc的时候,没有把我们自定义的annotation显示显示出来,我们要怎么把我们写的annotation信息也显示在javadoc里面呢?
            @Documented   //这一句就是在生成javadoc的时候,如果遇到下面定义的annotation就要显示出来
            public @interface DocumentedAnnotation{
                String value() default "test";
           }
  
           public class DocumentedTest{
                 /*
                 * 测试生成javadoc
                 */
                 @
DocumentedAnnotation(value="welcome")
                  public void testJavadoc(){
                         System.out.println("哈哈");
                   }  
           } 

           点击myeclipse里面的project-->generate javadoc->设置 就可以生成javadoc了



名称: ♪4C.ESL | .↗Evon
口号: 遇到新问题♪先要寻找一个方案乄而不是创造一个方案こ
mail: 联系我



只有注册用户登录后才能发表评论。


网站导航: