一,Annotation简介

J2SE5.0提供了很多新的我,其中一个很重要的我就是对元数据的支持,在J2SE5.0中,这种元数据被称为注释,通过使用注释,程序开发人员可以在不改变原有逻辑的情况下,在源文件嵌入一些补充的信息.

Annotation可以用来修饰类,属性,方法,而且不影响程序运行,无论是否使用Annotation代码都可以正常进行.

java.lang.annotation.Annotation是Annotation的接口,只要是Annotation都必须实现此接口,此接口定义如下:

public interface Annotation{
public Class<? extends Annotation> annotationType();
public boolean equals(Object obj);
public int hashCode();
String toString();
}

二.系统内建的Annotation

以下讨论到的注解中有一些被称之为Meta注解,它们的目的注解其他注解,并且包含关于其它注解的信息。

  • @Retention:这个注解注在其他注解上,并用来说明如何存储已被标记的注解。这是一种元注解,用来标记注解并提供注解的信息。可能的值是:

    • SOURCE:表明这个注解会被编译器忽略,并只会保留在源代码中。
    • CLASS:表明这个注解会通过编译驻留在CLASS文件,但会被JVM在运行时忽略,正因为如此,其在运行时不可见。
    • RUNTIME:表示这个注解会被JVM获取,并在运行时通过反射获取。
  • @Target:这个注解用于限制某个元素可以被注解的类型。例如:

    • ANNOTATION_TYPE 表示该注解可以应用到其他注解上
    • CONSTRUCTOR 表示可以使用到构造器上
    • FIELD 表示可以使用到域或属性上
    • LOCAL_VARIABLE表示可以使用到局部变量上。
    • METHOD可以使用到方法级别的注解上。
    • PACKAGE可以使用到包声明上。
    • PARAMETER可以使用到方法的参数上
    • TYPE可以使用到一个类的任何元素上。
  • @Documented:被注解的元素将会作为Javadoc产生的文档中的内容。注解都默认不会成为成为文档中的内容。这个注解可以对其它注解使用。
  • @Inherited:在默认情况下,注解不会被子类继承。被此注解标记的注解会被所有子类继承。这个注解可以对类使用。

对于系统内建的3个Annotation这里就不多说了

序号 Annotation java中的声明
1 @override

主要是在方法覆写时使用,用于保证方法覆写的正确性

2 @Deprecated 主要功能是用来声明一个不建议使用的方法,如果在程序中使用了此方法,则在编译时将出现警告信息
3 @supperssWarning 主要功能是用来压制警告,例如,进行泛形操作时,如果在类声明时没有指明泛形,则肯定在编译时产生警告,那么此时就可以用这个注释来压制住这种警告.

三,自定义Annotation(本次学习的重点)

1. 定义简单的Annotation

格式如下:

public @interface Annotation AnnotationName{
数据类型 变量名称();
}

要定义Annotation必须使用@interface的方式进行定义,但是从格式中可以发现,在定义Annotation时也可以定义各种变量,但是变量定义 之后必须带上();

注意:使用@interface就相当于继承了Annotation的接口

例:

public @interface MyAnnotation{

}

其实这就是一个最简单的自定义的接口,其中没有定义任何变量.那么此时如何使用呢?要想使用此Annotation,需要定义其他的类,并使用@Annotationtv很简单

@MyAnnotation
public Class MyAnnotationTest{ }

2.向Annotation中设置内容

定义MyAnnotation可以接收一个变量

public @interface MyAnnotation{
public String value();//接收设置的内容
}

在以上的Annotation中定义了一个value以后在使用此Annotation时,可以将内容设置给value.

例:

@MyAnnotation("wangyang")
public class Demo{}

以上程序在使用Annotation时,向其中设置了一个内容,使用MyAnnotation中定义的value属性进行接收,在使用MyAnnotation时也可以直接指定接收的属性的名称

@MyAnnotation(value="wangyang")
public class Demo{}

以上形式一般只有向一个Annotation中指定多个属性时才会用到

3.在Annotation中设置多少属性

public @interface MyAnnotation{
public String key();
public String value();//接收设置的内容
}
@MyAnnotation(key="wang",value="wangyang")
public class Demo{}

但在现在定义的Annotation中,每次只能向Annotation中的属性传递一个内容,如果要为一个属性设置多个内容,则可以将一个属性定义成一个数组

public @interface MyAnnotation{
public String[] value();
}
@MyAnnotation(value={"wangyang01","wangyang02"})
public class Demo{}

4.在上面的操作中,所有内容都是需要用户在调用Annotation时手工设置的,当然,为了方便用户,有时也可以通过设置默认值的方式减少用户设置的内容

如果在一个定义好的Annotation中已经定义了若干个属性,但是在使用Annotation时并没指定其具体的内容,则在编译时就会出现错误

public @interface MyAnnotation{
public String key();
public String value();//接收设置的内容
}
@MyAnnotation(value="wangyang")
public class Demo{} @MyAnnotation(key="wang")
public class Demo{} @MyAnnotation
public class Demo{}

以上的用法都是错误的

如果我们这样做:

public @interface MyAnnotation{
public String key() default "wang";
public String value() default "wangyang";//接收设置的内容
}

这橛,以后在使用MyAnnotation时,如果没有设置内容,则会将默认值赋予属性,而如果已经明确地给出了内容,则是将给出的内容赋予属性

5.同样我们也可以使用枚举来限制设置的内容

在Annotation中也可以通过枚举来限制Annotation的取值范围

首先我们定义一个枚举:

public enum Color{
BLACK,RED,WHITE;
}

再定义MyAnnotation,此Annotation的取值必须是Color中的类型

public @interface MyAnnotation{
public Color color() default Color.RED; }

这样,以后再使用MyAnnotation时,所有的取值都必须从Color中取

@MyAnnotation(color=Color.RED)
public class Demo{}

四,定义一个完整的Annotation

@Documented
@Retention(value=RUNTIME)
@Ttarget(value=ANNOTATION_TYPE)
public @interface MyAnnotation{
public Color color() default Color.RED; }

注意:

  • @Retention:这个注解注在其他注解上,并用来说明如何存储已被标记的注解。这是一种元注解,用来标记注解并提供注解的信息。可能的值是:

    • SOURCE:表明这个注解会被编译器忽略,并只会保留在源代码中。
    • CLASS:表明这个注解会通过编译驻留在CLASS文件,但会被JVM在运行时忽略,正因为如此,其在运行时不可见。
    • RUNTIME:表示这个注解会被JVM获取,并在运行时通过反射获取。
  • @Target:这个注解用于限制某个元素可以被注解的类型。例如:

    • ANNOTATION_TYPE 表示该注解可以应用到其他注解上
    • CONSTRUCTOR 表示可以使用到构造器上
    • FIELD 表示可以使用到域或属性上
    • LOCAL_VARIABLE表示可以使用到局部变量上。
    • METHOD可以使用到方法级别的注解上。
    • PACKAGE可以使用到包声明上。
    • PARAMETER可以使用到方法的参数上
    • TYPE可以使用到一个类的任何元素上。
  • @Documented:被注解的元素将会作为Javadoc产生的文档中的内容。注解都默认不会成为成为文档中的内容。这个注解可以对其它注解使用。
  • @Inherited:在默认情况下,注解不会被子类继承。被此注解标记的注解会被所有子类继承。这个注解可以对类使用。

java_annotation_01的更多相关文章

随机推荐

  1. win平台下, 检测网络是否连接最好的办法

    [Delphi]检查URL是否有效的函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 function CheckUr ...

  2. UpdateLayeredWindow, Layered Windows, codeproject

    http://www.codeproject.com/Articles/16362/Bring-your-frame-window-a-shadow http://www.codeproject.co ...

  3. COJ 2135 Day10-例1

    Day10-例1 难度级别:B: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述 给定N个物品,价格分别为A1, A2…AN.设计一套面值互不 ...

  4. POJ-3189-Steady Cow Assignment(最大流+枚举)

    题意 此题题意不太好懂.现有n头牛和b个牛棚,每个牛棚可以养的牛的数目都有一个限制c[i],表示该牛棚最多只能关c[i]头牛,每头牛对每一个牛棚都有一个喜爱值,用1到b来表示,现在要安排这些牛,使得牛 ...

  5. 线段树(维护最大值):HDU Billboard

    Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. the identity used to sign the executable is no longer valid.解决方法

    the identity used to sign the executable is no longer valid.解决方法 一.重新下载Provisioning Profile 1.到devel ...

  7. Intellij 快捷键大全

    Intellij IDEA的快捷键非常好用,能大大提高我们的开发速度.这里列举了一些常用的快捷键. 快速查找: Ctrl+N  查找类 Ctrl+R  替换当前窗口的文本 Ctrl+F  当前代码中查 ...

  8. Linux网络编程echo多线程服务器

    echo_server服务器多线程版本 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #in ...

  9. 1002 A + B Problem II [ACM刷题]

    这一段时间一直都在刷OJ,这里建一个博客合集,用以记录和分享算法学习的进程. github传送门:https://github.com/haoyuanliu/Online_Judge/tree/mas ...

  10. KVM与VMware的性能比较

    结合网页http://www.linuxidc.com/Linux/2011-01/31755.htm等整理 物理环境内存4G ,CPU4个,动态硬盘120G KVM: 硬盘测试瞬间读取速度Timin ...