Java中三种简单注解介绍和代码实例(2)
public class TestAnnotations {
public static void main(String arg[]) throws Exception {
new TestAnnotations().doSomeTestNow();
}
@SuppressWarnings({"deprecation"})
public void doSomeTestNow() {
Test_Deprecated t2 = new Test_Deprecated();
t2.doSomething();
}
}
在本例中,使用 @SuppressWarnings压住了示例2中所示的deprecation警告信息. 因为该方法的这类警告被压住了,所以你不会再看到"deprecation"警告.
注意: 在最内层的元素上使用该注解是比较好的. 因此,如果你只想在一个特定的方法上压制一个警告,你应该在方法上标注,而不是在类上使用注解.
元注解(Meta-Annotations,Java注解类型)
元注解,实际上被称为注解的注解,包含四种类型. 分别是:
1.Target
2.Retention
3.Documented
4.Inherited
Target 注解
Target注解表明注解类型适用于哪种目标元素. 它包含下面的枚举类型值:
1.@Target(ElementType.TYPE) —— 可以适用于任何类的元素
2.@Target(ElementType.FIELD) —— 只适用于字段或属性
3.@Target(ElementType.METHOD) —— 只适用于方法的注解
4.@Target(ElementType.PARAMETER) —— 只适用于方法的参数
5.@Target(ElementType.CONSTRUCTOR) —— 只适用于构造函数
6.@Target(ElementType.LOCAL_VARIABLE) —— 只适用于局部变量
7.@Target(ElementType.ANNOTATION_TYPE) —— 指明声明类型本身是一个注解类型
示例4演示了Target 注解:
Java注解示例4
首先,定义了一个名为Test_Target的注解类型,带上 @Target元注解,如下所示:
@Target(ElementType.METHOD)
public @interface Test_Target {
public String doTestTarget();
}
接下来,创建一个类,它将使用Test_Target注解:
public class TestAnnotations {
public static void main(String arg[]) {
new TestAnnotations().doTestTarget();
}
// 在方法上使用注解,OK.
// 中间也可以不换行,换2行之类,Java忽略多余的换行
@Test_Target(doTestTarget="Hello World !")
public void doTestTarget() {
System.out.printf("Testing Target annotation");
}
}
@Target(ElementType.METHOD) 注解表明该注解类型只能被用来注解方法. 如果你编译这段代码,不会显示警告消息. 但是,如果将这个注解声明到一个字符串变量上,会发生什么呢? 就像下面这样:
public class TestAnnotations {
// 这是错误的做法,编译不会通过,因为注解的Level不对.
// 元注解指明了只能注解方法,就不能用来注解属性
@Test_Target(doTestTarget="Hello World !")
private String str;
public static void main(String arg[]) {
new TestAnnotations().doTestTarget();
}
public void doTestTarget() {
System.out.printf("Testing Target annotation");
}
}
唯一的变化就是注解声明从方法级转向字段级,这是不正确的. 因为你已经定义了注解 @Test_Target 只适用在方法级,如果你尝试编译这个类,你可能会得到这样的错误信息:
"TestAnnotations.java":
D:R_AND_DTestAnnotationsrctestmyannotation
TestAnnotations.java:16:
annotation type not applicable to this kind of declaration at line
16, column 0
@Test_Target(doTestTarget="Hello World !")
^
Error in javac compilation