Annotation简介

来源:互联网 发布:excel sql建立数据库 编辑:程序博客网 时间:2024/06/07 11:46

1      解释

Java的annotation,可以附加在package, class, method, field等上面,相当于给它们添加了额外的辅助信息。如果没有外部解析工具等对其加以解析和处理的情况,本身不会对Java的源代码或class等产生任何影响,也不会对它们的执行产生任何影响。

但借助外部工具,可以对annotation进行解析,做出相应的处理,比如运行时改变对象/方法的行为。

Annotation从java语义上提供元数据的支持。

什么是元数据(metadata)呢?

Metadata是描述数据本身的数据。

2      示例

2.1   场景描述

有一个不学无术的孩子,整日游手好闲,用时下流行的话来形容我觉得最恰当不过,那就是“吃老一族”,依仗着父母现在还能蹦跶,自己好吃懒做无所事事,有一天突然看到台湾呕像歌星菜10的演唱会海报,此时他就准备让老爸帮他倒腾一张贵宾票观看演出,要知道菜10的演唱会贵宾票那是相当难买了,但是老爸为了成全儿子,还是通过各种渠道想尽办法帮他料理,老爸找到了主办单位,经过一番金钱的沟通,最终人家愿意让他的儿子以贵宾的待遇参加演唱会,可是他儿子还不愿意主动的找到主办方亮出自己的身份,他的意思就是自己一进演出现场就要有服务人员识别自己贵宾的身份(都懒到什么程度了),无奈,经过老爸与主办方的一再思考,最后主办方灵机一动,我们可以给他一张卡,只要他带上这个卡,我们就会认出他来,这个卡就是“败家子”卡,到时候让他戴在胸前,父亲大赞此计甚妙!回家之后就给他儿子说了,当然他儿子也就以败家子贵宾的身份观看了演出,在进站口,检票人员一眼就找见了“败家子”并且经过牌号他刚好是“250”,如此幸运,除了享受贵宾待遇之外他还获得了其他的待遇。

2.2   代码实现

1、annotation:VIP

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

 

@Retention(RetentionPolicy.RUNTIME)//生命周期,即,在哪个阶段保留。SOURCECLASSRUNTIME

@Target(ElementType.TYPE)//限定Annotation所修饰的对象范围

public @interface VIP {

    String value();

}

2、model:BlackSheep

@VIP("250")

public class BlackSheep {

    public void attend(){

       System.out.println("观看演出");

    }

}

3、主办方:Main

public class Main {

    public static void main(String[] args){

       //创建一个败家子

       BlackSheep aBlackSheep = new BlackSheep();

       if (aBlackSheep.getClass().isAnnotationPresent(VIP.class)) {

           System.out.println("败家子来了");

       }

       aBlackSheep.attend();//肯定是可以观看演出的

    }

}

3      Jdk自带的annotation

@Deprecated 相当于Javadoc的@deprecated,被@Deprecated标注的对象class, method等被注明为不推荐使用。主要用于javac等编译工具。

@Override 注明对象method重载了父类的方法。javac等编译工具编译时会根据此Annotation判断重载方法是否正确。

@SuppressWarnings 告诉javac等编译器忽略所指定的特定的警告信息。

@Target被定义的annotation可以附加在那些对象上。

@Retention annotation的作用期间

4      语法

4.1     修饰符

与java类不同,annotation的修饰符是:@interface

示例:修饰符

public @interface MyAnnotation {

}

4.2    annotationmeta-annotation

被用来声明annotation类型的annotation

4.2.1   生命周期@Retention

使用注解@Retention标识annotation的生命周期

描述

CLASS

annotation信息将被编译器编译时保存在class文件中,但执行时不会在VM装载。也就是说不能在执行时动态取得annotation信息。未设置@Retention时这将是默认设置值。

RUNTIME

annotation信息将被编译器编译时保存在class文件中,执行时也会被VM装载。

SOURCE

annotation信息将被编译器编译时舍弃掉。

示例: @Retention

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

 

@Retention(RetentionPolicy.RUNTIME)

public @interface MyAnnotation {

 

}

4.2.2   使用范围@Target

使用注解@Target标识annotation可以附加在那些元素上

描述

备注

ANNOTATION_TYPE

应用于其他注解的元注解

 

CONSTRUCTOR

构造函数

 

FIELD

字段

 

LOCAL_VARIABLE

方法中的本地变量

不推荐使用

METHOD

方法

 

PACKAGE

 

PARAMETER

方法的参数

 

TYPE

类,接口或者枚举声明

 

示例: @Target

import java.lang.annotation.ElementType;

import java.lang.annotation.Target;

 

@Target(ElementType.FIELD)

public @interface MyAnnotation {

 

}

4.2.3   是否可继承@Inherited

子类是否可继承父类的annotation

如果子类不重写(Override)使用了@Inherited的注解的方法,则会继承注解内容;

如果子类重写(Override)了该方法,则对应的注解同样会被覆盖掉

4.3   属性/方法

4.3.1   语法:类型 名称();

示例: 属性/方法

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

 

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public @interface MyAnnotation {

    String value();

}

4.3.2   使用

略。

5      Annotation拓展

如果可以通过扩展annotation为已有的类添加额外的功能,这样功能都封装在annotation里,不是很爽么?

虽然,会让代码不容易读,但只要约定、文档都描述清楚,且测试到位,这样的功能还是很爽的!

那么怎么做呢?


参考:http://www.blogjava.net/freeman1984/archive/2010/05/05/320110.html

0 0
原创粉丝点击