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用来修饰注解的注解,使用这个注解,我们可以做到
网友评论