Java基础之理解Annotation
一、概念
Annontation是Java5开始引入的新特征。中文名称一般叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。
更通俗的意思是为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或框架使用的。
Annontation像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的声明语句中。
二、原理
Annotation其实是一种接口。通过Java的反射机制相关的API来访问annotation信息。相关类(框架或工具中的类)根据这些信息来决定如何使用该程序元素或改变它们的行为。
annotation是不会影响程序代码的执行,无论annotation怎么变化,代码都始终如一地执行。
Java语言解释器在工作时会忽略这些annotation,因此在JVM 中这些annotation是“不起作用”的,只能通过配套的工具才能对这些annontaion类型的信息进行访问和处理。
Annotation与interface的异同:
1)、Annotation类型使用关键字@interface而不是interface。
这个关键字声明隐含了一个信息:它是继承了java.lang.annotation.Annotation接口,并非声明了一个interface
2)、Annotation类型、方法定义是独特的、受限制的。
Annotation 类型的方法必须声明为无参数、无异常抛出的。这些方法定义了annotation的成员:方法名成为了成员名,而方法返回值成为了成员的类型。而方法返回值类型必须为primitive类型、Class类型、枚举类型、annotation类型或者由前面类型之一作为元素的一维数组。方法的后面可以使用 default和一个默认数值来声明成员的默认值,null不能作为成员默认值,这与我们在非annotation类型中定义方法有很大不同。
Annotation类型和它的方法不能使用annotation类型的参数、成员不能是generic。只有返回值类型是Class的方法可以在annotation类型中使用generic,因为此方法能够用类转换将各种类型转换为Class。
3)、Annotation类型又与接口有着近似之处。
它们可以定义常量、静态成员类型(比如枚举类型定义)。Annotation类型也可以如接口一般被实现或者继承。
三、应用场合
annotation一般作为一种辅助途径,应用在软件框架或工具中,在这些工具类中根据不同的 annontation注解信息采取不同的处理过程或改变相应程序元素(类、方法及成员变量等)的行为。
例如:Junit、Struts、Spring等流行工具框架中均广泛使用了annontion。使代码的灵活性大提高。
四、常见标准的Annotation
从java5版本开始,自带了三种标准annontation类型,
(1)、Override
java.lang.Override 是一个marker annotation类型,它被用作标注方法。它说明了被标注的方法重载了父类的方法,起到了断言的作用。如果我们使用了这种annotation在一个没有覆盖父类方法的方法时,java编译器将以一个编译错误来警示。
这个annotaton常常在我们试图覆盖父类方法而确又写错了方法名时加一个保障性的校验过程。
(2)、Deprecated
Deprecated也是一种marker annotation。当一个类型或者类型成员使用@Deprecated修饰的话,编译器将不鼓励使用这个被标注的程序元素。所以使用这种修饰具有一定的 “延续性”:如果我们在代码中通过继承或者覆盖的方式使用了这个过时的类型或者成员,虽然继承或者覆盖后的类型或者成员并不是被声明为@Deprecated,但编译器仍然要报警。
注意:@Deprecated这个annotation类型和javadoc中的 @deprecated这个tag是有区别的:前者是java编译器识别的,而后者是被javadoc工具所识别用来生成文档(包含程序成员为什么已经过时、它应当如何被禁止或者替代的描述)。
(3)、SuppressWarnings
此注解能告诉Java编译器关闭对类、方法及成员变量的警告。
有时编译时会提出一些警告,对于这些警告有的隐藏着Bug,有的是无法避免的,对于某些不想看到的警告信息,可以通过这个注解来屏蔽。
SuppressWarning不是一个marker annotation。它有一个类型为String[]的成员,这个成员的值为被禁止的警告名。对于javac编译器来讲,被-Xlint选项有效的警告名也同样对@SuppressWarings有效,同时编译器忽略掉无法识别的警告名。
annotation语法允许在annotation名后跟括号,括号中是使用逗号分割的name=value对用于为annotation的成员赋值:
代码:
@SuppressWarnings(value={"unchecked","fallthrough"}) publicvoid lintTrap() { /* sloppy method body omitted */ }
在这个例子中SuppressWarnings annotation类型只定义了一个单一的成员,所以只有一个简单的value={...}作为name=value对。又由于成员值是一个数组,故使用大括号来声明数组值。
注意:我们可以在下面的情况中缩写annotation:当annotation只有单一成员,并成员命名为"value="。这时可以省去"value="。比如将上面的SuppressWarnings annotation进行缩写:
代码:
@SuppressWarnings({"unchecked","fallthrough"})
如果SuppressWarnings所声明的被禁止警告个数为一个时,可以省去大括号:
@SuppressWarnings("unchecked")
五、自定义annontation示例
示例共涉及四个类:
清单1:Author.java
package com.magc.annotation; 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; /** * 定义作者信息,name和group * @author magc * */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Documented public @interface Author { String name(); String group(); }
清单2:Description.java
/** * */ package com.magc.annotation; 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; /** * @author magc * * 定义描述信息 value */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented public @interface Description { String value(); }
清单3:Utility.java
package com.magc.annotation; @Description(value ="这是一个有用的工具类") publicclass Utility { @Author(name ="haoran_202",group="com.magc") public String work() { return"work over!"; } }
注:这是个普通的Java类,运行了@Description和@Author注解。
清单3:AnalysisAnnotation.java
package com.magc.annotation; import java.lang.reflect.Method; publicclass AnalysisAnnotation { /** * 在运行时分析处理annotation类型的信息 * * */ publicstaticvoid main(String[] args) { try { //通过运行时反射API获得annotation信息 Class rt_class = Class.forName("com.magc.annotation.Utility"); Method[] methods = rt_class.getMethods(); boolean flag = rt_class.isAnnotationPresent(Description.class); if(flag) { Description description = (Description)rt_class.getAnnotation(Description.class); System.out.println("Utility's Description--->"+description.value()); for (Method method : methods) { if(method.isAnnotationPresent(Author.class)) { Author author = (Author)method.getAnnotation(Author.class); System.out.println("Utility's Author--->"+author.name()+" from "+author.group()); } } } } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
注:这是个与自定义@Description和@Author配套的基础框架或工具类,通过此类来获得与普通Java类Utility.java关联的信息,即描述和作者。
运行AnalysisAnnotation,输出结果为:
Utility's Description--->这是一个有用的工具类
Utility's Author--->haoran_202 from com.magc
本文转自:http://www.cnblogs.com/mandroid/archive/2011/07/18/2109829.html
相关推荐
总之,Java注解是一种强大的元编程工具,它增强了代码的可读性、可维护性和灵活性,使得框架和工具能更好地理解和操纵代码。了解并善用注解,可以帮助开发者编写更高效、更易维护的Java应用程序。
《Java Annotation手册》 在Java编程语言中,注解(Annotation)是一种元数据,它提供了在编译时或运行时处理代码的一种方式。通过注解,开发者可以向编译器或JVM提供有关代码的附加信息,而这些信息通常不直接影响...
【Java Annotation详解】 Java Annotation(注解)是自Java 5开始引入的一种元数据机制,它允许程序员在源代码的各个层次(如类、方法、变量等)添加额外的信息,这些信息可以被编译器、IDE或其他工具读取,以实现...
Java 1.5 引入了一种新的元编程机制——注解(Annotation),极大地增强了代码的可读性和可维护性。注解是一种在代码中添加元数据的方式,它允许程序员在源代码上添加一些信息,这些信息可以被编译器或运行时环境...
这个"java基础课程之一"的压缩包很可能是为了辅助这些概念的学习,包含练习和文档,帮助你巩固理论知识,并通过实践加深理解。通过系统学习和练习,你将能够熟练掌握Java编程的基本技能,为进一步深入学习Java EE、...
【Java基础】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年发布。Java以其“一次编写,到处运行”的特性,成为跨平台应用开发的首选语言。Java的基础部分主要包括...
《Java基础案例教程(第2版)》是一本旨在教授初学者Java编程基础知识的教材,其PPT形式的压缩包提供了清晰、直观的教学材料。在深入探讨这些知识点之前,我们首先了解一下Java语言的基础概念。 Java是一种面向对象...
这篇“Java基础知识总结(经典)”涵盖了Java开发中的核心概念和重要知识点,旨在为初学者和有经验的开发者提供一个全面的回顾。以下是主要的学习点: 1. **Java环境配置**:在开始编程之前,必须安装Java ...
这份"JAVA基础PPT下载"提供了一套基础的Java学习资源,适用于初学者,旨在引导新手进入Java的世界。以下是对这份教程可能包含的一些核心知识点的详细阐述: 1. **Java概述**:首先会介绍Java的历史背景,它的创始人...
张孝祥老师的"Java基础加强ppt.ppt"可能包含了以上部分或全部内容的详细讲解,通过PPT的形式,以清晰的结构和实例演示帮助学习者深入理解每一个知识点,并且针对面试常见问题进行解析和解答,以提高求职者的竞争力。...
"java-ppt.rar"可能是一个包含Java基础知识的演示文稿,旨在帮助初学者理解和掌握Java编程。"java .ppt"和"java ppt"是可能的PPT文件名,它们通常用于结构化教学,将复杂的编程概念分解成易于理解的步骤和示例。 在...
这个压缩包包含了整个Java基础学习过程的源代码,是学习者理解和巩固Java基础知识的重要资源。 1. **基本语法**: Java的基础语法包括变量声明、数据类型(如int、char、boolean等)、运算符(算术、比较、逻辑等)...
这份"Java基础思维导图"应该是为了帮助初学者系统地理解和掌握Java编程的基础知识而设计的。以下是一些关键的Java基础知识点: 1. **Java简介**:Java是由Sun Microsystems开发的一种面向对象的编程语言,其特点是...
通过“JAVA基础入门到精通pdf”,你可以逐步掌握这些基础知识,并通过实践加深理解。记住,理论学习与实际编程相结合是学好Java的关键。不断练习,参与开源项目,你将逐渐精通这门强大的编程语言。
Java是一种广泛使用的面向对象的编程语言,由Sun ...以上是Java基础知识的一些关键点。深入理解并熟练运用这些概念,将有助于你成为一名合格的Java开发者。在实践中不断探索和学习,你的Java技能将会不断提升。
在《Java Annotation入门》的基础上,这篇手册深入探讨了Annotation的定义、使用和功能。 一、Annotation的本质 Annotation提供了一种附加信息到程序元素(如类、方法、变量等)的方式,这些信息被称为元数据。元...
这份"Java基础考试复习资料"涵盖了初学者需要理解的重要概念,旨在帮助广大备考者有效地准备Java相关的考试。以下是一些关键知识点的详细说明: 1. **Java简介**:Java是由Sun Microsystems公司开发的一种跨平台、...
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为...以上就是Java基础学习资料所涵盖的主要知识点,通过深入理解和实践这些概念,你可以逐步掌握Java编程,并为进一步学习高级主题打下坚实的基础。
"Java基础思维导图"是一个辅助学习的工具,它以视觉化的形式呈现了Java的基础概念,使得初学者能够更直观地理解和掌握这门语言的核心知识点。 1. **类与对象**:在Java中,一切皆为对象。类是创建对象的模板,它...