Java 注解
Java Annotations
什么是java注解
Java注解不属于代码的一部分,但用来给代码添加元数据(metadata). Java注解并不会直接对其所注解的代码运行产生操作.
作用
编译器说明
Java有三个內建注解,分别是@Deprecated @Override 和 @SuppressWarnings. 他们可以给编译器确认指令.例如@override注解告诉编译器被注解的方法被覆盖.
编译期指令:注解可以为编译器提供编译期指令.他们还可以被软件构建工具用于生成代码,XML文件等
执行期指令: 这种注解可以在代码运行期通过Java反射机制操作程序运行.
注解基础
注解以@开始,后面跟着注解的名字,字符@告诉编译器这是一个注解.
例如
@Overrite
@表明这是一个注解,Overrite是这个注解的名字.
哪里可以使用注解
注解可以应用于类,接口,方法和属性.例如下面是为方法添加注解
@Override
void myAnnotationsMethod(){
//Do someting here
}
Java内建注解
Java有三个內建注解:
- @Override
- @Deprecated
- @SuppressWarnings
- @override注解
@override注解被用于在子类中覆盖父类的方法.这有助于增加代码的可读性,降低代码维护难度.例如,当改变父类方法的签名后,子类中没有
做同步的函数签名修改的情况下
* 如果子类中的覆盖方法使用了@override注解
编译器将抛出编译错误.以便开发人员及时方便的发现问题
* 如果子类中的覆盖方法没有使用该注解
编译器在编译时会认为这个方法并不是覆盖的父类方法而是子类新增的方法,从而编译通过.而这并不是开发人员期望的结果.
例子
public class MyParentClass {
public void justaMethod() {
System.out.println("Parent class method");
}
}
public class MyChildClass extends MyParentClass {
@Override
public void justaMethod() {
System.out.println("Child class method");
}
}
- @Deprecated注解
表示被注解的元素不应该
再被使用.例如
@Deprecated
public void oneDeprecatedMethod(){
//Do something here
}
- @SuppressWarnings
该注解告诉编译器忽略被注解元素编译时产生的警告信息.例如,当使用一个被@Deprecated注解的方法时,希望编译器忽略deprected警告,则可以使用如下的方式
@SuppressWarnings("depracation")
pulic void myNoWarningsMethod(){
myObject.oneDeprecatedMethod();
}
创建自定义注解
示例:
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Target(Element.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation{
int age() default 18;
String name();
String author() default "LeoSun";
String[] friendList();
public enum Sex{
MALE,FEMALE
}
Sex sex() default Sex.MALE;
}
- 注解创建时使用
@interface annotationName
其中annotationName为自定义注解的名字. - 自定义注解使用
元注解
(meta-annotation)进行注解 - 注解可以有元素,元素的形式类似于方法.但没有方法的实现部分.
- 所有注解extends
java.lang.annotation
接口,不能extends其他. - 包含默认值的元素,例如上例中的age,author等,在使用时可不赋值.例如
@MyCustomAnnotation(
name="LeoSun",
friendList="{"lili","xiaoming"}"
)
public classs myClass{
//...
}
下面介绍自定义注解中使用到的四个元注解
- @Documentd
在生成javadoc文档时,该注解会被生成到文档中. - @Target
指定该注解可被使用的位置.MyCustomAnnotation注解只能被使用在方法上.Target可使用的位置为
//注解方法
ElementType.METHOD
//注解包
ElementType.PACKAGE
//注解参数
ElementType.PARAMETER
//类,接口(包括注解)或枚举
ElementType.TYPE
ElementType.ANNOTATION_TYPE
//注解构造函数
ElementType.CONSTRUCTOR
//注解局部变量
ElementType.LOCAL_VARIABLE
//注解属性
ElementType.FIELD
如果注解没有使用@Target,则表明该注解可以使用在任何元素上.
- @Inherited
表明被该注解所注解的类的所有子类都会继承该注解.例如
@MyCustomAnnotation
public class MyParentClass {
...
}
public class MyChildClass extends MyParentClass {
...
}
这里,MyParentClass使用了MyCustomAnnotation, MyChhildClass是MyParentClass的子类,因此,MyChhildClass也具有MyCustomAnnotation注解.
- @Retention
表明被注解元素的生存期.有三种类型
//运行期有效,可被Java反射使用
RetentionPolicy.RUNTIME
//生成在.class文件中,程序运行期不可用
RetentionPolicy.CLASS
//被注解的元素在源代码文件中,既不会生成到class文件,在运行期也不可用
RetentionPolicy.SOURCE
注解创建完成,下一篇讲述如何处理自定义的注解.