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若丢弃了重复注解,自然也丢弃了子注解信息。

例如:


20170714 自定义Annotation_第1张图片
20170714 自定义Annotation_第2张图片
20170714 自定义Annotation_第3张图片

你可能感兴趣的:(20170714 自定义Annotation)