`

Java注释(Annotation)详解

 
阅读更多

转自:http://www.hrmzone.cn/?p=528

 

注释:在一个类中可以有多个,类似于一个类可以有多个实例;
     注释类型:是注释使用的结构,类似于类,仅有一个版本,因此多个注释可能使用相同的注释类型
     jdk默认的三个注释:
       1.Override注释:仅用于方法(不可用于类、包的生命或其他),指明注释的方法将覆盖超类中的方法(如果覆盖父类的方法而没有注
释就无法编译该类),注释还能确保注释父类方法的拼写是正确(错误的编写,编译器不认为是子类的新方法,而会报错)
       2.@Deprecated注释:对不应再使用的方法进行注释,与正在声明为过时的方法放在同一行。使用被     Deprecated注释的方法,编译器会
提示方法过时警告(”Warring”)
       3.@SuppressWarnings注释:单一注释,可以通过数组提供变量,变量值指明要阻止的特定类型警告(忽略某些警告)。数组中的变量指明要阻止的警告@SuppressWarnings(value={”unchecked”,”fallthrough”}))

     上面提到“单一注释”这个概念,他表示注释的类型,java中有三种类型的注释:
       1.标记注释:由名称标记,未提供数据,@MarkerAnnotation
       2.单一注释:与标记注释类似,但提供了一段很少一点的数据,很类似普通的java方法调用(@SingleValueAnnotation(”my data”)
       3.完整注释:有多个数据成员,必须提供完整的语法(@FullAnnotation(var=”data value”,var2=”data value2″,var3=”data value3″))除了通过默认语法向注释提供值,还可以通过花括号为注释变量提供值数组,数组用”,”分割
自定义注释:
     @interface:注释声明,定义注释类型(与默认的Override等三种注释类型类似),使用时与内置注释类型类似。使用定制注释类型时,要将注释定义类导入,或者直接引入包名。(定义注释类型和定义类非常类似,仅在注释类型名称前多了@interface),自定义注释类型中的变量如同类中的方法定义需要”()”,并以”;”结束
     在使用有变量的注释类型时,需要制定数据类型的名称,但是如果注释类型中只有一个变量,最好将参数名称设为value,赋值时不用指定定名称而直接赋值如:变量名称(@AnnotationType(var value)),否则需要制定变量的名称(@Annotation(varname=varvalue))
     注释类型的默认值:在定义注释的成员变量,需要在成员的声明后添加关键字(default)并对其赋值(默认值),注意默认值的类型必须和成员变量的类型一致。在使用该注释类型时,如果没有给该注释类型的成员变量赋值即用默认值
     现在自定义注释来演示:
     1.在eclipse中新建一个Annotation类:FirstAnno.java

	package cn.hrmzone.anno;
	import java.lang.annotation.Documented;
	import java.lang.annotation.ElementType;
	import java.lang.annotation.Retention;
	import java.lang.annotation.RetentionPolicy;
	import java.lang.annotation.Target;
	@Documented
	@Retention(RetentionPolicy.RUNTIME)
	@Target(ElementType.TYPE)
	// 在使用@interface后,表明是自动继承子annotation类
	public @interface FirstAnno {
	//	只有一个参数,可以直接命名为value,在使用时,可以不指定参数名而直接赋值;
	//	而且,value()是类似方法,其实是自定义声明的一个参数,使用时是直接赋值和获	取的。类似与Bean的getter和setter方法。
	//	default:定义参数的默认值
	String value() default "FirstAnno";
	}

     2.再新建一个Annotation类:SecondAnnotation:

package cn.hrmzone.anno;
 
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SecondAnno {
//	注释中含有两个参数
	String name() default "Hrmzone";
	String url() default "hrmzone.cn";
}

     这个时候,估计对
     @Documented
     @Retention(RetentionPolicy.RUNTIME)
     @Target(ElementType.METHOD)
     这三个注释有很多疑问了吧,先将演示完成在解释:
     3.新建一个使用以上定义的两个注释的类:Anno.java

package cn.hrmzone.anno;
 
@FirstAnno("http://hrmzone.cn")
public class Anno {
//	不赋值注释中的参数,使用默认参数
	@SecondAnno()
	public String getDefault() {
		return "get default Annotation";
	}
	@SecondAnno(name="desktophrm",url="desktophrm.com")
	public String getDefine() {
		return "get define Annotation";
	}
}

     4.测试注释:AnnoTest.class

package cn.hrmzone.anno;
 
import java.io.File;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
 
public class AnnoTest {
	public static void main(String[] args) throws ClassNotFoundException {
//		要使用到反射中的相关内容
			Class c=Class.forName("cn.hrmzone.anno.Anno");
			Method[] method=c.getMethods();
			boolean flag=c.isAnnotationPresent(FirstAnno.class);
			if(flag) {
				FirstAnno first=(FirstAnno) c.getAnnotation(FirstAnno.class);
				System.out.println("First Annotation:"+first.value()+"\n");
			}
 
			List<Method> list=new ArrayList<Method>();
			for(int i=0;i<method.length;i++) {
				boolean f=method[i].isAnnotationPresent(SecondAnno.class);
				if(f) {
					list.add(method[i]);
				}			
			}
 
			for(Method m:list) {
				SecondAnno anno=m.getAnnotation(SecondAnno.class);
				System.out.println("second annotation's\nname:\t"+anno.name()+"\nurl:\t"+anno.url());
			}
	}
}

     测试的输出结果为:

First Annotation:http://hrmzone.cn
 
second annotation's
name:	desktophrm
url:	desktophrm.com
second annotation's
name:	Hrmzone
url:	hrmzone.cn

     结合源文件中注释,想必对注释的应用有所了解。下面深入了解。
     深入注释:
     上面的两个Annotation类中有三个奇怪的注释,他们是元注释。
     元注释:注释的注释,对注释进行注释,下面分别介绍这三个注释:
     @Target:指定程序元定义的注释所使用的地方,它使用了另一个类:ElementType,是一个枚举类定义了注释类型可以应用到不同的程序元素以免使用者误用。看看java.lang.annotation 下的源代码:

 @Documented  
 @Retention(RetentionPolicy.RUNTIME)  
 @Target(ElementType.ANNOTATION_TYPE)  
 public @interface Target {  
    ElementType[] value();  
 }

     ElementType是一个枚举类型,指明注释可以使用的地方,看看ElementType类:

 public enum ElementType {  
     TYPE, // 指定适用点为 class, interface, enum  
     FIELD, // 指定适用点为 field  
     METHOD, // 指定适用点为 method  
     PARAMETER, // 指定适用点为 method 的 parameter  
     CONSTRUCTOR, // 指定适用点为 constructor  
     LOCAL_VARIABLE, // 指定使用点为 局部变量  
     ANNOTATION_TYPE, //指定适用点为 annotation 类型  
     PACKAGE // 指定适用点为 package  
 }

     @Retention:这个元注释和java编译器处理注释的注释类型方式相关,告诉编译器在处理自定义注释类型的几种不同的选择,需要使用RetentionPolicy枚举类。此枚举类只有一个成员变量,可以不用指明成名名称而赋值,看Retention的源代码:

 @Documented  
 @Retention(RetentionPolicy.RUNTIME)  
 @Target(ElementType.ANNOTATION_TYPE)  
 public @interface Retention {  
    RetentionPolicy value();  
 }

     类中有个RetentionPolicy类,也是一个枚举类,具体看代码:

 	public enum RetentionPolicy {  
     SOURCE, // 编译器处理完Annotation后不存储在class中  
     CLASS, // 编译器把Annotation存储在class中,这是默认值  
     RUNTIME // 编译器把Annotation存储在class中,可以由虚拟机读取,反射需要  
 }

     @Documented:是一个标记注释,表示注释应该出现在类的javadoc中,因为在默认情况下注释时不包括在javadoc中的。所以如果花费了大量的时间定义一个注释类型,并想描述注释类型的作用,可以使用它。注意他与@Retention(RetentionPolicy.RUNTIME)配合使用,因为只有将注释保留在编译后的类文件中由虚拟机加载,然后javadoc才能将其抽取出来添加至javadoc中。
     @Inherited:将注释同样继承至使用了该注释类型的方法中(表达有点问题,就是如果一个方法使用了的注释用了@inherited,那么其子类的该方法同样继承了该注释)
注意事项:
     1.所有的Annotation自动继承java.lang.annotation接口
     2.自定义注释的成员变量访问类型只能是public、default;
     3.成员变量的只能使用基本类型(byte、short、int、char、long、double、float、boolean和String、Enum、Class、annotations以及该类型的数据)
     4.如果只有一个成员变量,最好将参数名称设为value,赋值时不用制定名称而直接赋值
     5.在实际应用中,还可以使用注释读取和设置Bean中的变量。

分享到:
评论

相关推荐

    Java_Annotation详解

    ### Java_Annotation详解 #### 元数据的作用与分类 元数据在编程中扮演着至关重要的角色,尤其是在Java中,通过注解(Annotation)这一特性,元数据被广泛应用于多个方面,包括但不限于文档生成、代码分析以及编译...

    Java Annotation Overview详解

    Java Annotation Overview是Java编程语言中一个重要的特性,它允许开发者向源代码中添加元数据,这些数据不直接影响程序的运行,但可以被编译器、IDE或其他工具使用。本篇文章将深入探讨Java注解的基本概念、用途...

    java高手真经 光盘源码

    java高手真经 全光盘源代码 打包rar 第1部分(2个程序包) HelloWorld.zip 01.Java入门样例HelloWorld demo.zip 03.Eclipse入门样例...javaannotation.zip 28.Java注释符编程 javafeature.zip 29.Java5.0语言新特性

    JAVA2 SDK类库详解

    10. **Java注解(Java Annotation)**: 用于添加元数据到代码中,帮助编译器、工具和运行时系统提供额外的信息。 通过深入研究“JAVA2 SDK类库详解”,开发者可以更好地掌握Java的这些核心概念,提升编程技能,解决...

    Java高手真经(编程基础卷)光盘全部源码 免积分

    看到那些要积分的很不酸,发布免费版本。 第1部分(2个程序包) HelloWorld.zip 01.Java入门样例HelloWorld demo.zip 03.Eclipse入门...javaannotation.zip 28.Java注释符编程 javafeature.zip 29.Java5.0语言新特性

    Java高手真经(编程基础卷)光盘全部源码

    看到很多人都分卷打包的,下载很是不方便,还浪费积分,我就整合压缩打包到一个包里面,里面包含全部源码 源码目录如下: ...javaannotation.zip 28.Java注释符编程 javafeature.zip 29.Java5.0语言新特性

    Annotation File Specification

    ### Annotation File Specification详解 #### 一、概述 **Annotation File Specification**(注解文件规范)是一种用于外部存储Java注解的文本格式规范。通常情况下,Java注解是作为元数据来描述Java程序元素的一...

    java注解详解[文].pdf

    Java 注解详解 Java 注解(Annotation)是 JDK 5.0 及以后版本引入的一个特性。它是一个新的类型,与接口类似,位于同一个层次,称为 Java 的一个类型(TYPE)。注解可以声明在包、类、字段、方法、局部变量、方法...

    annotation(注释)版本的hibernate

    《注释驱动的Hibernate实战详解》 在Java的持久化框架中,Hibernate以其强大的功能和易用性,深受开发者喜爱。然而,随着Java技术的发展,传统的XML配置方式逐渐被注解(Annotation)所取代,使得代码更加简洁、...

    java注解详解,十分有用。

    Java 注解详解 Java 注解(Annotation)是 JDK 5.0 及以后版本引入的一个特性,它是一个新的类型,与类、接口、枚举是在同一个层次。注解可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些...

    吴天雄-Java注解及动态性详解.doc

    Java注解,也称为Annotation,是自JDK 5.0版本起引入的一种元数据机制,它为程序提供了额外的信息,这些信息可以在编译时或运行时被解析和使用。元数据是描述数据的数据,注解就是一种特殊的数据类型,可以用于修饰...

    实体类注释避免配置xml文件

    本文将深入探讨如何通过实体类注释(即Java Annotation)来简化Hibernate框架下的对象关系映射(ORM),从而避免了传统XML配置文件的冗余与繁琐。在现代的Java开发中,尤其是基于ORM框架如Hibernate的应用开发,实体...

    jdk注释讲解

    ### JDK注释详解:深入理解Java中的注解 在Java开发中,注解(Annotation)是一种重要的元数据机制,用于向编译器、工具或框架提供额外的信息,从而增强代码的功能性和可读性。本文将从JDK源注释出发,深入解析三种...

    java @interface 注解详解及实例

    Java 中的注解(Annotation)是从 Java 5 开始引入的一种特殊类型的接口,它可以在编译时、类加载时或运行时被读取,并且可以被用来生成描述信息、强制编译检查、.runtime processing 等多种用途。下面是关于 Java @...

    Java核心API

    Java.lang.annotation包自J2SE5起引入,支持注释(元数据),增强了代码的可读性和扩展性。 #### Java.lang.instrument Java.lang.instrument包支持程序插装技术,允许开发者在运行时动态修改字节码,从而实现性能...

    java 注解的几大作用及使用方法详解

    Java 注解,从名字上看是注释,解释。但功能却不仅仅是注释那么简单。注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后某个时刻方便地使用这些数据(通过 解析注解 来使用这些...

Global site tag (gtag.js) - Google Analytics