`
jaesonchen
  • 浏览: 313159 次
  • 来自: ...
社区版块
存档分类
最新评论

详解Java中的注解

 
阅读更多

在Java中,注解(Annotation)引入始于Java5,用来描述Java代码的元信息,通常情况下注解不会直接影响代码的执行,尽管有些注解可以用来做到影响代码执行。

注解可以做什么

Java中的注解通常扮演以下角色

  • 编译器指令
  • 构建时指令
  • 运行时指令

其中

  • Java内置了三种编译器指令,本文后面部分会重点介绍
  • Java注解可以应用在构建时,即当你构建你的项目时。构建过程包括生成源码,编译源码,生成xml文件,打包编译的源码和文件到JAR包等。软件的构建通常使用诸如Apache Ant和Maven这种工具自动完成。这些构建工具会依照特定的注解扫描Java代码,然后根据这些注解生成源码或文件。
  • 通常情况下,注解并不会出现在编译后的代码中,但是如果想要出现也是可以的。Java支持运行时的注解,使用Java的反射我们可以访问到这些注解,运行时的注解的目的通常是提供给程序和第三方API一些指令。

注解基础

一个简单的Java注解类似与@Entity。其中@的意思是告诉编译器这是一个注解。而Entity则是注解的名字。通常在文件中,写法如下

1
2
public @interface Entity { 
}

注解元素

Java注解可以使用元素来进行设置一些值,注解中的元素类似于属性或者参数。定义包含元素的注解示例代码

1
2
3
public @interface Entity { 
  String tableName();
}

使用包含元素的注解示例代码

1
@Entity(tableName = "vehicles")

上述注解的元素名称为tableName,设置的值为vehicles。没有元素的注解不需要使用括号。

如果注解包含多个元素,使用方法如下

1
@Entity(tableName = "vehicles", primaryKey = "id")

如果注解只有一个元素,通常我们的写法是这样的

1
@InsertNew(value = "yes")

但是这种情况下,当且仅当元素名为value,我们也可以简写,即不需要填写元素名value,效果如下

1
@InsertNew("yes")

注解使用

注解可以用来修饰代码中的这些元素

  • 接口
  • 方法
  • 方法参数
  • 属性
  • 局部变量

一个完整的使用示例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@Entity
public class Vehicle {
    @Persistent
    protected String vehicleName = null;
    @Getter
    public String getVehicleName() {
        return this.vehicleName;
    }
    public void setVehicleName(@Optional vehicleName) {
        this.vehicleName = vehicleName;
    }
    public List addVehicleNameToList(List names) {
        @Optional
        List localNames = names;
        if(localNames == null) {
            localNames = new ArrayList();
        }
        localNames.add(getVehicleName());
        return localNames;
    }
}

内置的Java注解

Java中有三种内置注解,这些注解用来为编译器提供指令。它们是

  • @Deprecated
  • @Override
  • @SuppressWarnings

@Deprecated

  • 可以用来标记类,方法,属性。
  • 如果上述三种元素不再使用,使用@Deprecated注解
  • 如果代码使用了@Deprecated注解的类,方法或属性,编译器会进行警告。

@Deprecated使用很简单,如下为注解一个弃用的类。

1
2
3
4
@Deprecated
public class MyComponent {
}

当我们使用@Deprecated注解后,建议配合使用对应的@deprecated JavaDoc符号,并解释说明为什么这个类,方法或属性被弃用,已经替代方案是什么。

1
2
3
4
5
6
7
@Deprecated
/**
  @deprecated This class is full of bugs. Use MyNewComponent instead.
*/
public class MyComponent {
}

@Override

@Override注解用来修饰对父类进行重写的方法。如果一个并非重写父类的方法使用这个注解,编译器将提示错误。

实际上在子类中重写父类或接口的方法,@Overide并不是必须的。但是还是建议使用这个注解,在某些情况下,假设你修改了父类的方法的名字,那么之前重写的子类方法将不再属于重写,如果没有@Overide,你将不会察觉到这个子类的方法。有了这个注解修饰,编译器则会提示你这些信息。

使用Override注解的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class MySuperClass {
    public void doTheThing() {
        System.out.println("Do the thing");
    }
}
public class MySubClass extends MySuperClass{
    @Override
    public void doTheThing() {
        System.out.println("Do it differently");
    }
}

@SuppressWarnings

  • @SuppressWarnings用来抑制编译器生成警告信息。
  • 可以修饰的元素为类,方法,方法参数,属性,局部变量

使用场景:当我们一个方法调用了弃用的方法或者进行不安全的类型转换,编译器会生成警告。我们可以为这个方法增加@SuppressWarnings注解,来抑制编译器生成警告。

注意:使用@SuppressWarnings注解,采用就近原则,比如一个方法出现警告,我们尽量使用@SuppressWarnings注解这个方法,而不是注解方法所在的类。虽然两个都能抑制编译器生成警告,但是范围越小越好,因为范围大了,不利于我们发现该类下其他方法的警告信息。

使用示例

1
2
3
4
@SuppressWarnings
public void methodWithWarning() {
}

创建自己的注解

在Java中,我们可以创建自己的注解,注解和类,接口文件一样定义在自己的文件里面。如下

1
2
3
4
5
6
@interface MyAnnotation {
    String   value();
    String   name();
    int      age();
    String[] newNames();
}

上述代码定义了一个叫做MyAnnotation的注解,它有4个元素。再次强调一下,@interface这个关键字用来告诉java编译器这是一个注解。

仔细一看,你会发现,注解元素的定义很类似于接口的方法。这些元素有类型和名称。这些类型可以是

  • 原始数据类型
  • String
  • Class
  • annotation
  • 枚举
  • 一维数组

如下为应用自定义的注解

1
2
3
4
5
6
7
8
9
10
@MyAnnotation(
    value="123",
    name="Jakob",
    age=37,
    newNames={"Jenkov", "Peterson"}
)
public class MyClass {
}

注意,我们需要为所有的注解元素设置值,一个都不能少。

注解元素默认值

对于注解中的元素,我们可以为其设置默认值,使用方法为

1
2
3
4
5
6
@interface MyAnnotation {
    String   value() default "";
    String   name();
    int      age();
    String[] newNames();
}

上述代码,我们设置了value元素的默认值为空字符串。当我们在使用时,可以不设置value的值,即让value使用空字符串默认值。 使用示例代码

1
2
3
4
5
6
7
8
@MyAnnotation(
    name="Jakob",
    age=37,
    newNames={"Jenkov", "Peterson"}
)
public class MyClass {
}

@Retention

@Retention是用来修饰注解的注解,使用这个注解,我们可以做到

  • 控制注解是否写入class文件
  • 控制class文件中的注解是否在运行时可见

控制很简单,使用使用以下三种策略之一即可。

  • RetentionPolicy.SOURCE 表明注解仅存在源码之中,不存在.class文件,更不能运行时可见。常见的注解为@Override, @SuppressWarnings。
  • RetentionPolicy.CLASS 这是默认的注解保留策略。这种策略下,注解将存在与.class文件,但是不能被运行时访问。通常这种注解策略用来处于一些字节码级别的操作。
  • RetentionPolicy.RUNTIME 这种策略下可以被运行时访问到。通常情况下,我们都会结合反射来做一些事情。

@Retention的使用示例

1
2
3
4
5
6
7
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
    String   value() default "";
}

@Target

使用@Target注解,我们可以设定自定义注解可以修饰哪些java元素。简单示例

1
2
3
4
5
6
7
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target({ElementType.METHOD})
public @interface MyAnnotation {
    String   value();
}

上述的代码说明MyAnnotation注解只能修饰方法。

@Target可以选择的参数值有如下这些

  • ElementType.ANNOTATION_TYPE(注:修饰注解)
  • ElementType.CONSTRUCTOR
  • ElementType.FIELD
  • ElementType.LOCAL_VARIABLE
  • ElementType.METHOD
  • ElementType.PACKAGE
  • ElementType.PARAMETER
  • ElementType.TYPE(注:任何类型,即上面的的类型都可以修饰)

@Inherited

如果你想让一个类和它的子类都包含某个注解,就可以使用@Inherited来修饰这个注解。

1
2
3
4
5
6
java.lang.annotation.Inherited
@Inherited
public @interface MyAnnotation {
}
1
2
@MyAnnotation
public class MySuperClass { ... }
1
public class MySubClass extends MySuperClass { ... }

上述代码的大致意思是

  1. 使用@Inherited修饰注解MyAnnotation
  2. 使用MyAnnotation注解MySuperClass
  3. 实现一个类MySubclass继承自MySuperClass

通过以上几步,MySubClass也拥有了MyAnnotation注解。

关于Java中的注解,一些基本的概念就是这些。

分享到:
评论

相关推荐

    Java元注解是Java注解的重要特性,下面我就来详解常见的4大Java元注解

    Java 元注解详解 Java 元注解是 Java 注解的重要特性,它们是用于修饰注解的注解。Java 元注解的作用是通过使用 Java 元注解,可以为注解指定:作用范围、生命周期、是否可重复和是否继承等信息,从而提高注解的...

    Java 注解技术视频详解

    Java注解技术是Java平台中一个非常重要的特性,它为元数据提供了强大的支持,使得开发者能够在代码中嵌入额外的信息,这些信息可以被编译器、JVM或第三方工具读取和处理。在本视频教程中,我们将深入探讨Java注解的...

    android&java的注解详解demo

    在编程世界中,Java注解(Annotation)是一个强大的工具,它允许程序员在代码中嵌入元数据,这些元数据不直接影响程序的运行,但可以被编译器或运行时环境用来进行各种处理。Android开发中,注解同样扮演着重要角色...

    JAVA 注解示例 详解

    本篇文章将深入探讨Java注解的使用及其在实际开发中的应用。 首先,我们了解Java注解的基本结构。一个注解以`@`符号开头,后面跟着注解类型,如`@Override`或`@Deprecated`。注解可以带有参数,参数以键值对的形式...

    java注解详解[文].pdf

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

    java 元注解 用于定义其它的注解

    Java 元注解详解 Java 元注解是 Java 语言中的一种特殊的注解,用于定义其他的注解。元注解的作用是提供一种机制,用于定义和描述其他注解的行为和范围。Java 中提供了多种元注解类型,每种元注解类型都有其特定的...

    java注解详解

    ### Java注解详解 #### 一、注解(Annotation)简介 注解是Java语言自JDK 5.0版本引入的一种新特性,用于在代码中添加元数据(即关于数据的数据)。它允许开发人员向Java编译器、工具和其他框架提供额外的信息,而不...

    java 自定义注解的实例详解

    在本文中,我们将详细介绍 Java 自定义注解的实例详解,包括如何创建自定义注解、如何使用反射来获取注解信息 oraz 如何使用自定义注解来实现特定的功能。 一、Java 注解的基本概念 Java 注解是一种特殊的标记,它...

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

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

    Java自定义注解与spring BeanPostProcessor详解

    结合这两个概念,我们可以在自定义注解中定义特定的行为,然后通过BeanPostProcessor来处理这些注解。例如,可以创建一个`@Transactional`的自定义注解,用于标记那些需要事务管理的方法。然后,实现一个...

    Java注解机制之Spring自动装配实现原理详解

    Java注解机制之Spring自动装配...Java注解机制之Spring自动装配实现原理详解是指Spring框架中使用Java注解机制来实现自动装配功能的机制,该机制可以根据注解信息来自动将Bean对象关联起来,从而实现了自动装配功能。

    Java自定义注解的详解

    Java自定义注解的详解 Java 注解(Annotation)是一种元数据,它提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容。在这个教程中,我们将学习 Java 的注解,如何定制注解,注解的使用以及如何通过...

    java程序使用JPA注解详解.doc

    Java 程序使用 JPA 注解详解 Java 持久层 API(Java Persistence API)是一种 Java 应用程序接口,用于访问、管理和持久化数据之间的关系。JPA 使用注解来定义实体类与数据库表之间的映射关系,本文将详细介绍 JPA ...

    Java中的注解及自定义注解使用详解.docx

    Java注解是编程语言的一种元数据机制,它们允许程序员在代码中嵌入额外的信息,这些信息可以在编译时或运行时被编译器或虚拟机使用。Java从1.5版本开始引入注解,现在已经成为许多现代Java框架,如Hibernate、Jersey...

    Java 基础(5-8) - 注解机制详解.pdf

    Java基础(5-8) - 注解机制详解 Java中的注解机制是从JDK1.5版本开始引入的特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。它主要的作用有四方面:生成文档、编译检查、编译时...

    java或Java框架中常用的注解及其作用详解_资料.docx

    Java注解,也称为标注,是Java开发中的一个重要特性,自JDK 5.0引入。它们提供了一种元数据的方式,允许程序员在代码中添加信息,这些信息可以在编译时或运行时被编译器或Java虚拟机(JVM)处理。注解不同于Javadoc,...

    java程序使用JPA注解详解

    Java 程序使用 JPA 注解详解 Java 程序使用 JPA 注解可以实现对象关系映射(ORM),使得 Java 应用程序能够与关系数据库进行交互。JPA(Java Persistence API)提供了多种注解来定义实体类与数据库表之间的映射关系...

    Spring java注解,元注解和自定义注解

    ### Spring Java注解、元注解与自定义注解详解 #### 一、Java注解简介 在深入了解Spring框架中的注解应用之前,我们首先需要对Java注解有一个基本的认识。Java注解(Annotation)是一种元数据,可以为程序代码添加...

Global site tag (gtag.js) - Google Analytics