`

Annotation 介绍

 
阅读更多

从JDK5开始提供名为Annotation(注释)的功能,它被定义为JSR-175规范。注释是以“@注释名”在代码中存在的,还可以添加一些参数值,例如:@SuppressWarnings(value="unchecked")。注释可以附加在package, class, method, field等上面,相当于给它们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问。如果没有外部解析工具等对其加以解析和处理的情况,本身不会对Java的源代码或class文件等产生任何影响,也不会对它们的执行产生任何影响。
元数据的作用,大致可分为三种:编写文档,通过代码里标识的元数据生成文档;代码分析,通过代码里标识的元数据对代码进行分析;编译检查,通过代码里标识的元数据让编译器能实现基本的编译检查。
JDK5内置的基本注释
JDK5内置了一些常用的注释,可以在编译时帮我们捕获部分编译错误,及提示信息,下面介绍下这些注释的用法:
1、@Override定义在java.lang.Override中,此注释只适用于修辞方法,表示一个方法声明打算重写超类中的另一个方法声明。如果方法利用此注释类型进行注解但没有重写超类方法,则编译器会生成一条错误消息。例如我们为某类重写toString()方法却写成了tostring(),并且我们为该方法添加了@Override注释;代码如下:

public class OverrideDemo {
@Override
public String tostring() {
return super.toString();
}
}

在编译时,会提示以下错误信息:OverrideTest.java:4: 方法未覆盖其父类的方法
@Override
^1 错误

2、@Deprecated定义在java.lang.Deprecated中,此注释可用于修辞方法、属性、类,表示不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告。使用@Deprecated的示例代码如下:

public class DeprecatedDemo {
public static void main(String[] args) {
DeprecatedClass.DeprecatedMethod();
}
}

class DeprecatedClass {
@Deprecated
public static void DeprecatedMethod() {
// TODO
}
}

在编译时,会得到以下提示信息:注意:DeprecatedDemo.java 使用或覆盖了已过时的 API。
注意:要了解详细信息,请使用 -Xlint:deprecation 重新编译。

如果在编译时添加-Xlint:deprecation参数,我们能更清楚的看到该警告的详细信息,如下:DeprecatedDemo.java:6: 警告:[deprecation] SomeClass 中的 DeprecatedMethod() 已过时
SomeClass.DeprecatedMethod();
^1 警告

要注意@Deprecated与@deprecated的区别,@deprecated是为了生成文档的需要,例如:class DeprecatedClass {
/**
* @deprecated 此方法已过时,不建议使用
*/
@Deprecated
public static void DeprecatedMethod() {
// TODO
}
}

3、@SuppressWarnings定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息。与前两个注释有所不同,你需要添加一个参数才能正确使用,这些参数值都是已经定义好了的,我们选择性的使用就好了,参数如下:参数说明
deprecation使用了过时的类或方法时的警告
unchecked执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型

fallthrough当 Switch 程序块直接通往下一种情况而没有 Break 时的警告
path在类路径、源文件路径等中有不存在的路径时的警告
serial当在可序列化的类上缺少 serialVersionUID 定义时的警告
finally任何 finally 子句不能正常完成时的警告
all关于以上所有情况的警告

通过上面的表格,你应该了解到每个参数的用意了,下面我就以一个常用的参数unchecked为例,为你展示如何使用@SuppressWarnings注释,示例代码如下:

import java.util.List;
import java.util.ArrayList;
public class SuppressWarningsDemo {
public static List cache = new ArrayList();
//@SuppressWarnings(value = "unchecked")
public void add(String data) {
cache.add(data);
}
}

当我们不使用@SuppressWarnings注释时,编译器就会有如下提示:注意:SuppressWarningsDemo.java 使用了未经检查或不安全的操作。
注意:要了解详细信息,请使用 -Xlint:unchecked 重新编译。

下面我们去掉@SuppressWarnings(value="unchecked")这一行的注释符“//”,它会屏蔽编译时的警告信息,这也就是它所要达到的目的。
另外,由于@SuppressWarnings注释只有一个参数,并且参数名为value,所以我们可以将上面一句注释简写为@SuppressWarnings("unchecked");
同时参数value可以取多个值如:@SuppressWarnings(value={"unchecked", "deprecation"})
或@SuppressWarnings({"unchecked", "deprecation"})。


自定义Annotation注释
1、注释annotation与接口的异同:
因为annotation类型是一个非凡的接口,所以它与接口之间存在着某些差异:
A. Annotation类型使用关键字@interface而不是interface,这个关键字声明隐含了一个信息,它是继承了java.lang.annotation.Annotation接口,并非声明了一个interface。
B. Annotation类型的方法定义是独特的、受限制的,方法必须声明为无参数、无异常抛出的。这些方法定义了annotation的成员:方法名成为了成员名,而方法返回值成为了成员的类型。而方法返回值类型必须为primitive类型、Class类型、枚举类型、annotation类型或者由前面类型之一作为元素的一维数组。方法的后面可以使用default和一个默认数值来声明成员的默认值,null不能作为成员默认值,这与我们在非annotation类型中定义方法有很大不同。
C. Annotation类型又与接口有着近似之处,它们可以定义常量、静态成员类型(比如枚举类型定义)。Annotation类型也可以如接口一般被实现或者继承。


2、自定义注释的实例:
下面,我们将看到如何定义annotation类型的例子。它展示了annotation类型声明以及@interface与interface之间的不同:import java.lang.annotation.*;
/**
* 使用annotation来描述那些被标注的成员是不稳定的,需要更改
*/
public @interface Unstable {
}

下面的另一个例子只定义了一个成员。并通过将这个成员命名为value,使我们可以方便的使用这种annotation的快捷声明方式:/**
* 使用Author这个annotation定义在程序中指出代码的作者
*/
public @interface Author {
/** 返回作者名 */
String value();
}

以下的例子更加复杂。Reviews annotation类型只有一个成员,但是这个成员的类型是复杂的:由Review annotation组成的数组。Review annotation类型有3个成员:枚举类型成员grade、表示Review名称的字符串类型成员Reviewer、具有默认值的字符串类型成员 Comment。/**
* Reviews annotation类型只有一个成员,
* 但是这个成员的类型是复杂的:由Review annotation组成的数组
*/
@Retention(RetentionPolicy.RUNTIME)
public @interface Reviews {
Review[] value();
}
/**
* Review annotation类型有3个成员:
* 枚举类型成员grade、
* 表示Review名称的字符串类型成员Reviewer、
* 具有默认值的字符串类型成员Comment。
*/
public @interface Review {
// 内嵌的枚举类型
public static enum Grade { EXCELLENT, SATISFACTORY, UNSATISFACTORY };
// 下面的方法定义了annotation的成员
Grade grade();
String reviewer();
String comment() default "";
}

最后,我们来定义一个annotation方法用于罗列出类运行中所有的unchecked异常。这个 annotation类型将一个数组作为了唯一的成员。数组中的每个元素都是异常类。为了加强对未检查的异常(此类异常都是在运行时抛出)进行报告,我们可以在代码中对异常的类型进行限制:public @interface UncheckedExceptions {
Class<? extends RuntimeException>[] value();
}

Meta-Annotation类型:
Annotation 类型可以被它们自己所标注。Java5.0定义了4个标准的meta-annotation类型,分别是:Target、Retention、Documented、Inherited它们被用来提供对其它annotation类型作说明。 这些类型和它们所支持的类在java.lang.annotation包中可以找到。
@Target的用法:指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制。例如,以下这个注释只能用来声明方法:

@Target(ElementType.METHOD)
public @interface MyAnnotation {
...
}

java.lang.annotation.ElementType是一个枚举类型,它具有以下定义:ElementType值说明
ElementType.ANNOTATION_TYPE应用于注释类型声明
ElementType.CONSTRUCTOR构造方法声明
ElementType.FIELD应用于字段声明(包括枚举常量)
ElementType.LOCAL_VARIABLE应用于局部变量声明
ElementType.METHOD应用于方法声明
ElementType.PACKAGE应用于包声明
ElementType.PARAMETER应用于参数声明
ElementType.TYPE应用于类、接口(包括注释类型)或枚举声明

@Retention的用法:指示注释类型的注释要保留多久。如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS,例如:@ Retention(RetentionPolicy.CLASS)
public @interface MyAnnotation {
...
}

java.lang.annotation.RetentionPolicy是一个枚举类型,它具有以下定义:RetentionPolicy值说明
RetentionPolicy.CLASS编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释
RetentionPolicy.RUNTIME编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取
RetentionPolicy.SOURCE编译器要丢弃的注释

@Documented的用法:指示某一类型的注释将通过 javadoc 和类似的默认工具进行文档化。应使用此类型来注释这些类型的声明:其注释会影响由其客户端注释的元素的使用。如果类型声明是用 Documented 来注释的,则其注释将成为注释元素的公共 API 的一部分。Documented是一个没有成员的注释。
@Inherited的用法:指示注释类型自动被子类继承。 Inherited也是一个没有成员的注释。
注意,如果使用@Inherited注释类以外的任何事物都是无效的。还要注意,此元注释仅对从超类继承注释有效;对已实现接口的注释无效。

 

/******************/

java中@Override

@Override是java的编译时批注(annotation)语法,
作用是让java编译器在发现有此批注的方法并没有重载父类中的方法时抛出一个error
并不影响运行时,而且大小写敏感,所以不能写成@override等诸如此类

@Override — the @Override annotation informs the compiler that the element is meant to override an element declared in a superclass (overriding methods will be discussed in the the lesson titled "Interfaces and Inheritance").
// mark method as a superclass method
// that has been overridden
@Override
int overriddenMethod() { }

While it's not required to use this annotation when overriding a method, it helps to prevent errors. If a method marked with @Override fails to correctly override a method in one of its superclasses, the compiler generates an error.

分享到:
评论

相关推荐

    JDK5.0 Java Annotation 介绍(ppt)

    以下是关于 Java Annotation 的详细介绍: 一、为什么使用 Annotation 1. **减少模板代码**:在开发过程中,有时我们需要重复编写相同的模板代码,例如创建 JAX-RPC Web 服务时。通过 Annotation,我们可以让工具...

    JDK5.0-Java Annotation 介绍

    Java Annotation(注解)是自JDK 5.0开始引入的一种元数据,它提供了一种安全、非侵入式的方式来向编译器、虚拟机或者其他的工具提供关于代码的信息。这种信息可以用来进行编译时检查、运行时处理、代码生成等。注解...

    hibernate中文APIhibernate annotation 中文API

    **Hibernate Annotation介绍:** Hibernate Annotation是Hibernate的扩展,它通过在Java实体类上使用注解来定义数据库表结构和字段映射。例如,@Entity标记一个类为数据库表,@Table指定对应的表名,@Id表示主键,@...

    Annotation详细介绍(大全)

    Annotation是Java语言中的一种元数据,它提供了在代码中附加信息的能力,这些信息可以在编译时或运行时被解析和使用。Annotation的本质是一种特殊类型的注解,它允许开发者向编译器、JVM或者工具提供关于代码的额外...

    精通Java Web整合开发(第2版)

    12.4.3 hibernate中的常用annotation介绍534 12.4.4 一对一关联的annotation注解实现536 12.4.5 多对一单向关联的annotation注解实现538 12.4.6 一对多双向关联的annotation注解实现540 12.4.7 一对多双向自身关联的...

    Annotation注解的介绍和使用

    ### Annotation注解的深入解析与应用 #### 一、Annotation概览 ##### 1.1 何为元数据 元数据,在计算机科学中,是指用于描述数据的数据,它提供了关于数据本身的附加信息,有助于理解、解释和管理数据。在编程...

    用Annotation简化Java程序的开发(PDF)

    #### 二、Annotation技术介绍 **Annotation** 是Sun Microsystems(现已被Oracle收购)在发布JDK 5.0时新增的重要特性之一。这种特性允许开发者在代码中添加元数据,即用来描述其他代码的数据。Annotation可以应用...

    Hibernate Annotation 中文文档

    以上是对Hibernate Annotation的简要介绍,深入理解和熟练应用这些注解,将有助于提升你在Java持久化领域的专业技能。对于更详细的用法和高级特性,建议查阅《Hibernate Annotations参考文档-3.20》这份资料,以获取...

    通过提问ChatGPT来解决枚举和注解等需求问题

    11.13基本的Annotation介绍 11.14基本的Annotation应用案例 11.14.1@Over ide注解的案例 11.14.2@Deprecated注解的案 例 11.14.3@Suppress Warnings 注解的案例 11.15J DK的元Annotation(元注 解,了解)

    annotation 详解

    通过本文的介绍,我们可以看到`Annotation`在Java编程中扮演着非常重要的角色。它不仅有助于提高代码的可读性和维护性,还能够帮助开发者更好地管理代码生命周期中的不同阶段。无论是用于文档化还是编译时检查,`...

    前端开源库-get-annotation

    - `README.md`文件:介绍项目的基本信息、安装和使用方法。 - `LICENSE`文件:声明项目的开源许可协议。 在实际开发中,要使用"get-annotation",首先需要通过npm安装(假设已安装Node.js环境): ```bash npm ...

    hibernate annotation 中文文档

    《Hibernate Annotation 中文文档》是Java开发者们的重要参考资料,它详细介绍了如何在Hibernate框架中使用注解进行对象关系映射(ORM)。Hibernate是一款强大的开源Java持久化框架,它简化了数据库与Java对象之间的...

    point-cloud-annotation-tool win10解压直接运行

    1. 点云标注工具介绍: 点云标注工具是专门用于标记和分类点云数据的软件,它可以辅助用户为点云数据添加各种元信息,如边界框、类别标签等。这在机器学习和深度学习项目中极其关键,因为准确的标注数据是训练模型...

    Spring MVC Annotation验证的方法

    本文将详细介绍 Spring MVC Annotation验证的方法,包括使用 Spring MVC 自带的 Annotation 验证和自定义 Annotation 验证。 一、Spring MVCAnnotation 验证简介 Spring MVC 框架提供了多种Annotation来实现验证,...

    springMVC-annotation注解介绍

    @Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。 1、共同点 两者都可以写在字段和setter方法上。两者...

    Java Annotation详解及实例代码

    二、基础Annotation介绍 1. @Override `@Override` 注解用于标识一个方法是重写父类的方法。使用这个注解可以确保子类确实覆盖了父类的方法,避免因方法签名不匹配而导致的意外。它只能应用于方法,不能用于类或...

    hibernate-annotation 所需要的jar包

    下面将详细介绍Hibernate-Annotation所涉及到的知识点。 1. **Hibernate框架**: Hibernate是Java领域中最流行的ORM框架之一,它提供了一种在Java应用程序中管理和访问关系数据库的方法。通过ORM,Java对象可以直接...

    注解annotation的详细介绍

    注解(Annotation)是Java语言中的一个重要特性,自JDK5开始引入,它提供了一种安全的方式,使得程序员可以向源代码中添加元数据(metadata)。元数据是关于数据的数据,它并不改变程序运行方式,但可以被编译器、...

Global site tag (gtag.js) - Google Analytics