參考文獻:《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若丟棄了重復注解,自然也丟棄了子注解信息。
例如: