搜尋此網誌

2009年12月2日 星期三

Java Annotation



  • 在Java 1.5 ,annotation data可以在runtime and compile-time處理




  • 紫色的字是Marker Annotation的例子





    public class Annotation {


    }
    class A{

    @Deprecated

    public void test(){

    }
    }




  • Annotation Type是annotations的藍圖,宣告Annotation Type類似宣告interface,只是在interface前面多加了@符號:


     

    public @interface TestAnnotationType {

    String printSomthing();
    }




  • Annotation Type的元素是用方法來定義,這個方法不可以傳入參數,也不可以丟出例外,而回傳值必須是基本型別,
    String, Class, enums, annotations, 以及以上型別的陣列,方法也可以有預設值.


     


    public @interface TestAnnotation {

    String sayHello();
    String defaultSayHello() default "hello";
    }





  • Annotation可以提供額外的資訊給程式使用,可以在compile的時候設定deprecated method展示出warning messages,或是說利用annotation
    讓一些tools產生程式碼,或是說在執行時期把值(Value)傳給method使用.





  • Annotation可以用在class,interface,method,還有field





  • Java5提供了metadata的能力,可以讓你自己定義annotation type.






  • 一個沒有元素的Annotation type被稱為Marker annotation type.




    public @interface TestAnnotation {


    }




  • Marker annotation type的使用上可以省略{},如下例:





    public @interface TestAnnotation {


    }
    @TestAnnotation
    class Test1 { }





  • 單一元素的annotation type可以直接給值,如下例:






    public @interface TestAnnotation {

    String value();
    }
    @TestAnnotation ("Test")
    class Test1 { }





  • annotation 是一種特別的修飾子,它可以放在任何修飾子(諸如public ,privte,protected,等等)可以放的地方,而annotations的值只可以是編譯時期常數.






Annotation的整理













import java.lang.annotation.*;
import java.lang.reflect.Method;


@Retention(RetentionPolicy.RUNTIME) //告訴Jvm可以在執行時期讀取
@Target(ElementType.METHOD)//這個annotation type只可以用在method
public @interface Test {
}

class Foo {
@Test public static void m1() { }
public static void m2() { }
@Test public static void m3() {
throw new RuntimeException("Boom");
}
public static void m4() { }
@Test public static void m5() { }
public static void m6() { }
@Test public static void m7() {
throw new RuntimeException("Crash");
}
public static void m8() { }
}

class RunTest {

public static void main(String[] args) throws Exception {
String[]ar={"Foo"};
int passed = 0, failed = 0;
for (Method m : Class.forName(ar[0]).getMethods()) {
if (m.isAnnotationPresent(Test.class)) {//依次取出annotation type為Test的method
try {
m.invoke(null);
passed++;
} catch (Throwable ex) {//如果有丟出exception就算失敗
System.out
.printf("Test %s failed: %s %n", m, ex.getCause());
failed++;
}
}
}
System.out.printf("Passed: %d, Failed %d%n", passed, failed);
}
}



參考連結:
Java Guide

沒有留言:

張貼留言