本文参考自《Java高级程序设计》清华大学出版社,侵删
Java常用注解:
1.@Override 表示当前定义的方法将覆盖父类的同名、同参数方法
2.@SuppressWarnings 关闭无须关心的警告信息,可用于整个类上或用于方法上
3.@Deprecated 声明方法或类已过时,不建议使用
注解的使用方法:
1.在类上使用注解,作用于整个类
@Deprecated
public abstract class Person {
}
该注释表示该类已过时,不建议使用该类
可以看出,注解的使用像修饰符一样
2.在方法上使用注解,只对目标方法起作用
public class Person {
@Deprecated
public void speak(String message) {
}
@Override
public String toString() {
return "This is a person!";
}
}
该例中 @Deprecated 表示 speak方法 已过时,不建议使用
@Override 表示 toString方法 覆盖了 Object类的toString方法
3.在属性上使用注解
public class Person {
@Deprecated
public String name;
}
该例中 @Deprecated 表示该属性已过时,不建议使用该属性,如果使用了该属性,编译器将抛出警告信息
4.为注解设置参数
public class Person {
@SuppressWarnings(value="unused")
private String name;
public void speak(String message) {
@SuppressWarnings({"unchecked","unused"})
List list = new ArrayList();
System.out.println("Speak:"+message);
}
}
这个例子为了演示注解的功能,所以添加了很多注解,一般情况下无须这样使用。
第一个注解使用了参数value,并为其赋值“unused”,表示这个属性上 无须 抛出未使用警告。
第二个注解表示 局部变量list 无须进行 抛出检测警告和未使用警告。
自定义注解:
元注解:元注解是Java定义的用于创建注解的工具,它们本身也是注解。
Java中的元注解包括以下4个:
1.@Target 表明了自定义注解的作用域
可能的作用域被定义在一个枚举类型中:ElementType
2.Retention 用于声明注解信息的保留策略,可选的级别被存放在枚举RetentionPolicy中。
3.@Documented 表明制作Javadoc是,是否将注解信息加入文档。
如果注解在声明时使用了@Documented,则在制作Javadoc时注解信息会加入Javadoc。
4.@Inherited 表明注解是否会被子类继承,默认情况是不继承的。
如果注解在声明时使用了@Inherited ,则该注解会被使用了该注解的类的子类所继承。
定义注解:
自定义注解是在上述介绍的Java元注解继承上构建的。
注解的定义与接口很相似,而且注解类型编译后也会产生一个Class文件,这与接口和类相同。
下面的例子定义了一个简单的注解Test。
package org.ddd.section4.example4_5;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
}
这个注解上使用了两个元注解,
其中,@Target 表示 @Test 的作用范围,此处声明为ElementType.METHOD,表明这是一个作用在方法上的注解。
@Retention 表明 @Test 的保留策略,此处声明为RetentionPolicy.RUNTIME,表明这些注解信息将被保留到运行时。
为注解声明参数:
package org.ddd.section4.example4_6;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Entity {
public int type() default -1;
public String name();
}
该例定义了一个注解 @Entity
它的作用域是ElementType.TYPE,表明它可以作用在类、接口或枚举上。
它的保留策略是RetentionPolicy.RUNTIME,表明@Entity的信息将会保留到运行时。
这个注解定义了两个参数 type 和 name,
第一个参数type类型为int,默认值为-1;
第二个参数name类型为String,没有默认值,也没有指明默认值的参数,在使用时必须指明具体的值。
如何使用自定义的注解:
package org.ddd.section4.example4_7;
@Entity(name = "Person")
public class Person {
@Test
public void speak(String message){}
}
这个例子中使用了例4-5和例4-6中定义的注解。
注解参数说明:
编译器对注解的参数要求很高,所以在声明参数时必须满足以下条件。
1.参数类型必须使用指定参数类型(所有基本类型)
2.注解参数的赋值要求:不能是不确定值