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


