java注解

java注解用来描述java代码中的元信息,通常情况下,注解不会影响代码执行,尽管有些情况下,注解可以做到影响代码的执行。

java注解在java5被添加进来,

java注解的作用
java注解通常被用来用作以下目的

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

java内置了三种编译器指令,本文后面会详细介绍。

java注解可以应用于构建时,即当你构建你的项目时。构建的过程包括产生源代码、编译源代码、产生xml文件,将编译过的代码或文件打包进jar文件等等。软件的构建通常使用Apache Ant或者Apache Maven这样的工具自动完成。构建工具会扫描java代码里的注解,然后根据这些注解产生源代码或者其它的文件。

通常情况下,注解不会出现在编译之后的java代码中,但是想要出现也是可以的。java支持运行时注解。这些注解可以通过java反射访问,运行时注解主要是提供给程序或者第三方API一些指令。


注解基础

一个简单的java注解类似于下面这种
@Entity@符号告诉编译器这是一个注解,跟在@符号后面的是注解的名字。上述例子中注解的名字是Entity。

注解元素

java注解可以使用元素设置一些值。元素类似于属性或者参数。下面是一个包含元素注解的例子。

@Entity(tableName = "vehicles")

上述注解元素名称是tableName,值是vehicles,没有元素的注解不需要括号。注解可以包含多个元素,下面就是包含多个元素的例子。

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

当注解只包含一个元素时,你可以省去写元素的名字,直接赋值即可。下面的例子就是直接赋值。

@InsertNew("yes")

注解使用

注解可以在以下场合被使用到

  • 接口

  • 方法

  • 方法参数

  • 属性

  • 局部变量
    下面是一个完整使用注解的例子。

      @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注解使用很简单,以下是使用@Deprecated注解一个已经弃用的类。

@Deprecated
public class MyComponent {
    
}

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

    @Deprecated
    /**
      @deprecated Use MyNewComponent instead.
    */
    public class MyComponent {
    
    }

@Override

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

使用@Override的例子如下。

    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

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

当一个方法调用了一个被弃用的方法或者是不安全的类型转换,编译器就会产生警告,你可以使用@SuppressWarnings抑制编译器产生警告。

使用示例如下

    @SuppressWarnings
    public void methodWithWarning() {
    
    }

创建自己的注解

可以定义自己的注解,和类或者接口一样,注解可以定义在自己的文件中。

使用自定义注解如下

    @interface MyAnnotation {
         String   value();
        String   name();
        int      age();
        String[] newNames();
    }

上述例子定义了一个叫MyAnnotation的注解,它有四个元素。@interface告诉编译器这是一个注解。

每个元素的定义与接口中的方法定义类似,它有数据类型和名字。这些类型可以是

  • 原始数据类型

  • String

  • Class

  • annotation

  • 枚举

  • 一维数组

    以下示例为应用自定义注解

      @MyAnnotation(
          value="123",
          name="Jakob",
          age=37,
          newNames={"Jenkov", "Peterson"}
      )
      public class MyClass {
      
      }
    

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

    元素的默认值

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

      @interface MyAnnotation {
    
          String   value() default "";
          String   name();
          int      age();
          String[] newNames();
      
      }
    

    上述注解中我们设置value的值为空字符串,那么我们在使用此注解时,可以不设置value的值,即让value使用设置的空字符串的默认值。示例如下

      @MyAnnotation(
          name="Jakob",
          age=37,
          newNames={"Jenkov", "Peterson"}
      )
      public class MyClass {
      
      }
    

    @Retention

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

你可能感兴趣的:(java注解)