本文翻译自GeeksforGeeks - Annotation in Java,侵删
什么是注解
注解用于提供一个程序的辅助信息。
注解都是“@”开头 注解不对程序做任何改动 注解可以帮助程序的方法、变量等元素关联其元信息 注解不是注释! 注解可以被编译器识别,根据注解的含义进行编译
class Base{ public void display(){ System.out.println("Base display()"); } } class Derived extends Base{ @Override public void display(int x){ System.out.println("Derived display(int )"); } public static void main(String args[]){ Derived obj = new Derived(); obj.display(); } }
Output:
10: error: method does not override or implement
a method from a supertype
如果我们将参数int x
或者@Override
移除,那么程序可以成功编译。
注解的种类
注解有三种
标记注解 - Maker Annotation
只是用来标记一个声明,没有成员和数据。因此,只要有注解的Signature存在就可以用了。
@Override
就是一个标记注解。
单值注解 - Single Value Annotation
这种注解只有一个成员,并且可以简单的给这个成员赋值。赋值的时候,我们只要在括号里面传入一个值,不需要知道这个成员名。
@TestAnnotation("Hey!")
完整注释 - Full Annotation
这种注解是单值注解的升级版,多个成员的注解。我们需要知道这些成员名
@TestAnnotation(name="钢铁大郭", value="是个coder")
注解的用法
类型注释 - Type Annotation
注解可以使用在任何注明了类型的地方。比如,方法返回值。
// 演示Type注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
// 使用Target来注解一个类型
@Target(ElementType.TYPE_USE)
// 声明一个简单的标记注解
@interface TypeAnnoDemo{}
public class Main {
public static void main(String[] args) {
// 注解这个String类型的返回值
@TypeAnnoDemo String string = "I am annotated with a type annotation";
System.out.println(string);
abc();
}
// 注解一个返回值
static @TypeAnnoDemo int abc(){
System.out.println("This function's return type is annotated");
return 0;
}
}
// This code is contributed by Charchit Kapoor
Output:
I am annotated with a type annotation
This function's return type is annotated
重复注解 - Repeating Annotation
注解可以使用一次或多次。
注解必须要用@Repeatble
注解过的,java.lang.annotation
package里面。
一个是容器注解,一个是元素注解,元素注解要在容器注解里面。
import java.lang.annotation.Annotation;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;
// Words是一个被Repeatable修饰的可重复注解
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(MyRepeatedAnnos.class)
@interface Words{
String word() default "Hello";
int value() default 0;
}
// 创建容器注解
@Retention(RetentionPolicy.RUNTIME)
@interface MyRepeatedAnnos{
Words[] value();
}
public class Main {
// 重复使用@Words
@Words(word = "First", value = 1)
@Words(word = "Second", value = 2)
public static void newMethod(){
Main obj = new Main();
try{
Class<?> c = obj.getClass();
// 反射获取方法
Method m = c.getMethod("newMethod");
// 使用反射找到重复注解然后打印
Annotation anno = m.getAnnotation(MyRepeatedAnnos.class);
System.out.println(anno);
}catch (NoSuchMethodException e){
System.out.println(e);
}
}
public static void main(String[] args) {
newMethod();
}
}
// This code is contributed by Charchit Kapoor
Output:
@MyRepeatedAnnos(value={@Words(value=1, word="First"), @Words(value=2, word="Second")})