Java Annotation

注解的作用

1、wikipedia上对Annotation的概念介绍

Annotation,是Java语言中的一种特殊的元数据语法,可以被添加到Java代码中。类,方法,变量,参数,包都可以被标注。与Javadoc的标签不同,注解是可以被反射的,因为他们被编译器生成嵌入在编译后文件,并保留在虚拟机中以便在运行时被索引。

2、Sun网站上写的
     JDK5引入了Metedata(元数据)很容易的就能够调用Annotations.Annotations提供一些本来不属于程序的数据,比如:一段代码的作者或者告诉编译器禁止一些特殊的错误。An annotation 对代码的执行没有什么影响。Annotations使用@annotation的形式应用于代码:类(class),属性(field),方法(method)等等。一个Annotation出现在上面提到的开始位置,而且一般只有一行,也可以包含有任意的参数。


meta-annotation(元注解)介绍

元注解是用来描述注解的注解,它不能直接应用于普通类的类、变量、方法、参数、构造方法、本地变量、注解类型、包上。

Java内置的元注解

Target

用来修饰其它注解,用来标明其它注解应用在什么地方。

Documented

用来修饰其它注解,用来标明生成API说明时,其它注解信息是否输出。

Retention

指明被该注解注解的注解被保留的时间。有三个选项:SOURCE(注解将在编译时被丢弃)、CLASS(注解信息保留到编译后的class文件中,在VM中运行时注解信息会消失)、RUNTIME(编译后的class文件中会存在注解信息,且在VM运行时仍然保留。因此,该类注解可以用反射的方式进行读取)

创建自定义注解与解析注解流程

首先,我们新建一个注解类

package com.annotation;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Description {
String author() default "william"; //定义"作者"参数
    String date(); //定义"日期"参数
    String version();// 文件版本
}

我们自定义的注解Description是用来修饰类的,且该注解信息一致保持到VM运行期间。


接下来,我们新建一个使用该注解的类。因为上边定义的注解是要放在类上的,所以为了简单起见,我定义一个没有任何方法与属性的类

package com.annotation;


@Description(author = "Eisenhower", date = "20130718",version="2.1")
public class AnnotationTest {


}


下边我们开始解析注解信息

解析注解是使用的Java反射功能,代码如下:


控制台输出如下:

desc.author:Eisenhower
desc.date:20130718
desc.version:2.1


还有一些情况,感兴趣的童鞋们可以去测试一下,如果我把自定义注解@Retention的值设置为RetentionPolicy.SOURCE或RetentionPolicy.CLASS。那么运行测试的时候,都将会显示:没有在AnnotationTest上使用注解!。这主要是因为该注解信息并没有带到VM运行时内存。

当@Retention的值设置为RetentionPolicy.SOURCE时,使用反编译工具查看AnnotationTest类的源码,里边是没有注解信息的。


使用自定义注解的地方很多,常见于一些主流应用框架中,如springMVC、orm框架hibernate与mybatis。

使用注解可以使系统的配置更加灵活,但同时也增加了结构的复杂性。



一些需要注意的地方:

1、注解中的方法不能定义参数。

2、注解当中定义的方法不能定义抛出异常。


为方便与大家交流、分享开发经验,欢迎大家加入我建的QQ技术交流群:111412248。注意,加入本群需要在开发上有一定的深度与广度。


你可能感兴趣的:(Java基础,java,注解,annotation)