一,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. XE5 Android 开发数据访问server端

    http://www.cnblogs.com/key-ok/p/3326064.html http://www.cnblogs.com/key-ok/p/3326055.html http://www ...

  2. AOP小结

    AOP主要采用代理模式来实现的,静态代理(设计模式中的代理模式),动态代理(反射机制,实现InvocationHandler接口),cglib实现(采用继承方式,针对目标类生成子类,并覆盖方法进行增强 ...

  3. 2013年6月19日星期三java中函数地址值传递

    今天代码审核时确认了一个问题,理解了java中string和stringbuffer赋值问题,看到一个帖子很好,摘录如下: 理解这两个例子需要分清实参和形参的区别,引用和对象的区别 第一个例子的内部执 ...

  4. 动态规划 HDU 1176

    免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. ASP.NET网站发布-允许更新此预编译站点 打勾与不打勾的区别

    发布网站时在打开的对话框中,有一个选项是至关重要的,那就是“允许更新此预编译站点”: “允许更新此预编译站点”这一项,默认情况下,前面是打上一个√的,至于要不要打上一个√,是可选的,那么,打勾与不打勾 ...

  6. Rules

    我们之前处理异常的时候用到过Rules,当然还有很多其他规则.Rules允许弹性的添加或者重定义测试方法的行为.测试者可以重复使用或者扩展下面的某一个Rules,也可以写一个属于自己的规则. 这里先展 ...

  7. 什么是:VGA SVGA XGA SXGA

    经常可以看到VGA这些专业术语,通常这些重要技术指标指的是液晶屏(TFT LCD)的分辨率. TFT是英文Thin Film Transistor的缩写,中文意思是薄膜晶体管. VGA(Video G ...

  8. 一个美国小券商的生存之道Tradestation

    转自:证券时报记者 张欣然 桂衍民 中国互联网金融的口号喊了十几年,众多证券公司仍然苦于找不到新的蓝海,研究大西洋彼岸的美国TradeStation公司的业务模式,也许对国内的证券公司会有一些启迪. ...

  9. JavaScript中的[]和{}

    最早开始对js中括号的使用有疑问是在交互2值的时候: a = [b,b=a][0]; 详见JavaScript交换两个变量值的七种解决方案 因为 [[]][0] 的意思是:获取 [[]] 的第一个元素 ...

  10. Spring task任务调度详解

    spring内部有一个task是Spring自带的一个设定时间自动任务调度 task使用的时候很方便,但是他能做的东西不如quartz那么的多! 可以使用注解和配置两种方式,配置的方式如下 引入Spr ...