20170714 自定義Annotation

參考文獻:《Java瘋狂講義》(第三版)

自定義Annotation

定義新的Annotation類型使用@interface關鍵字

例如

public @interface Test{}

默認情況下,Annotation可用于修飾任何程序元素,包括類、接口、方法。

Annotation定義中以無形參的方法形式來聲明,其方法名和返回值定義類該成員變量的名字和類型。

例如:

public @interface MyTag{

String name();

int age() default 32;

}

使用default關鍵字指定成員變量默認值

根據Annotation是否可以包含成員變量,可以將Annotation分為如下兩類:

1、標記Annotation:

沒有定義成員變量的Annotation類型被成為標記。

2、元數據Annotation:

包含成員變量的Annotation,因為它們可以接受更多的元數據,也被稱為元數據Annotation

提取Annotation信息

使用Annotation修飾了類、方法、成員變量等成員后,這些Annotation不會自己生效,必須由開發者提供相應的工具提取并處理Annotation信息。

通過Annotation簡化事件編程

例子:

/**在傳統的事件編程中總是需要

*通過addActionListener()方法來為事件源

*綁定事件監聽器

*本例通過@ActionListenerFor 來為程序中的按鈕添加綁定事件監聽器

*/

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public @interface ActionListenerFor

{

Class? listener();

}

public class AnnotationTest{

private JFrame mainWin=new JFrame();

@ActionListenerFor(Listener=OkListener.class)

private JButton ok=new JButton();

@ActionListenerFor(listener=CancelListener.class)

private JButton cancel =new JButton();

public void init(){

...

ActionListenerInstaller.processAnnotation(this); //A

...

}

public static void main(String[] args){

}

}

//非內部類

class OkListener implements ActionListener{

@Override

public void actionPerformed(ActionEvent evt){}

}

class CancelListener implements ActionListener{

@Override

public void actionPerformed(ActionEvent evt){}

}

如果僅在程序中使用注解是不會起任何作用的,必須使用注解處理工具來處理程序中的注解。程序中A處代碼使用了ActionListenerInstaller類來處理本程序中的注解,該處理器分析目標對

象中的所有成員變量,如果該成員變量前使用了@ActionListenerFor修飾,則取出該Annotation中的listener元數據,并根據該數據來綁定事件監聽器。

public class ActionListenerInstaller

{...

}

Java8新增 重復注解

如果需要在同一個元素前使用多個相同類型的Annotation,則必須使用Annotation容器。

開發重復注解需要使用@Repeatable修飾。

定義重復注解時,@Retention(RetentionPolicy.RUNTIME)令注解信息保留到運行時,這是必須的

因為:重復注解注解信息需要保留到運行時,如果重復注解只能保留到源代碼級別,將會導致重復注解保留期限小于注解的保留期限,如果程序將多個注解放入到重復注解中,JVM若丟棄了重復注解,自然也丟棄了子注解信息。

例如:


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容