当前位置:文档之家› JAVA注解

JAVA注解

JAVA注解
1、什么是注解
从JDK5开始提供名为Annotation(注释)的功能,它被定义为JSR-175规范。

注释是以“@注释名”在代码中存在的,还可以添加一些参数值,例如:@SuppressWarnings(value="unchecked")。

注释可以附加在package, class, method, field 等上面,相当于给它们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问。

如果没有外部解析工具等对其加以解析和处理的情况,本身不会对Java的源代码或class文件等产生任何影响,也不会对它们的执行产生任何影响。

2、JDK5内置的基本注释
JDK5内置了一些常用的注释,可以在编译时帮我们捕获部分编译错误,及提示信息,下面介绍下这些注释的用法:
a、@Override定义在ng.Override中,此注释只适用于修辞方法,表示一个方法声明打算重写超类中的另一个方法声明。

如果方法利用此注释类型进行注解但没有重写超类方法,则编译器会生成一条错误消息。

例如我们为某类重写toString()方法却写成了tostring(),并且我们为该方法添加了@Override注释,在编译时,会提示错误:方法未覆盖其父类的方法。

b、@Deprecated定义在ng.Deprecated中,此注释可用于修辞方法、属性、类,表示不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。

在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告。

c、@SuppressWarnings定义在ng.SuppressWarnings中,用来抑制编译时的警告信息。

与前两个注释有所不同,你需要添加一个参数才能正确使用,这些参数值都是已经定义好了的,我们选择性的使用就好了,如@SuppressWarnings(value = "unchecked")。

3、自定义注解
Annotation类型使用关键字@interface定义一个注解,Annotation 类型可以被它们自己所标注。

Java5.0定义了4个标准的meta-annotation类型,分别是:Target、Retention、Documented、Inherited,它们被用来提供对其它annotation类型作说明。

这些类型和它们所支持的类在ng.annotation包中可以找到。

@Target的用法:指示注释类型所适用的程序元素的种类。

如果注释类型声明中不存在Target 元注释,则声明的类型可以用在任一程序元素上。

如果存在这样的元注释,则编译器强制实施指定的使用限制。

@Retention的用法:指示注释类型的注释要保留多久。

如果注释类型声明中不存在Retention 注释,则保留策略默认为 RetentionPolicy.CLASS。

@Documented的用法:指示某一类型的注释将通过 javadoc 和类似的默认工具进行文档化。

应使用此类型来注释这些类型的声明:其注释会影响由其客户端注释的元素的使用。

如果类型声明是用 Documented 来注释的,则其注释将成为注释元素的公共 API 的一部分。

Documented是一个没有成员的注释。

@Inherited的用法:指示注释类型自动被子类继承。

Inherited也是一个没有成员的注释。

注意,如果使用@Inherited注释类以外的任何事物都是无效的。

还要注意,此元注释仅对从超类继承注释有效;对已实现接口的注释无效。

示例代码:
@Target({ElementType.TYPE})//标识该注解应用于JA V A类
@Retention(RetentionPolicy.RUNTIME)//标识该注解存在于运行期
@Documented//生成JA V A文档
@Inherited//允许继承该注解
public @interface MyAnnotation {
String value();
}
上面定义了一个名叫MyAnnotation的注解类型,String value表示需要传递一个字符串类型的值给value属性。

可以使用Target注解类型指示该自定义注解类型所适用的程序元素种类。

ElementType.TYPE表示使用于类、接口或枚举声明。

使用注解类型Retention来指示该注解类型要保留多久,RetentionPolicy.RUNTIME表示编译器将把注解记录在类文件中,在运行时VM将保留注解,因此可以反射性的读取。

@Document表示该注解可以被写到文档里面。

@Inherited表示该注解可以被子类继承,但是@Target必须的属性值必须为ElementType.TYPE才能被继承。

4、注解用例
a 定义一个适用于JA V A类的注解javaSource:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface JavaSource {
String author() default "treeClimber"; /* 作者*/
String email() default "xionglb@"; /* 联系E_Mail */
String company() default "/"; /* 公司名*/
String project() default "common-util"; /* 所属项目*/
String descript(); /* 类描述*/
float version() default 1.0f; /* 版本号*/
String created(); /* 创建时间*/
}
b 定义一个适用于JA V A类和方法的注解LastModified:
@Target( { ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface LastModified {
int year();
int month();
int date();
}
c 使用以上定义的注解:
@JavaSource(version = 1.5f, project = "demoproj", descript = "学习Java5 Annotation", created = "2010-04-12")
public class JavaSourceTest {
@LastModified( year = 2010, month = 5, date = 5 )
public void say(String world) {
System.out.println("Hello, " + world);
}
@SuppressWarnings("deprecation")
public static void main(String[] args) {
if (JavaSourceTest.class.isAnnotationPresent(JavaSource.class)) {
JavaSource anno = JavaSourceTest.class.getAnnotation(JavaSource.class);
System.out.println("Author:" + anno.author());
System.out.println("Company:" + pany());
System.out.println("Descript:" + anno.descript());
}
try {
Method m = JavaSourceTest.class.getDeclaredMethod("say", String.class);
LastModified anno = m.getAnnotation(LastModified.class);
Date date = new Date(anno.year(), anno.month() - 1, anno.date());
System.out.println(date);
} catch (Exception e) {
e.printStackTrace();
}
}
5、。

相关主题