通过之前的学习,可以学会自定义一个注解。但是定义之后要怎么使用?
运行时的注解对象
注解本质上是一个接口,所以在运行时,会动态地生成一个实现了这个接口地类,并且将他实例化。
怎么实现接口的方法?
在使用注解时,如果注解有没有默认值的属性,则一定要给属性显式的赋值。所以,使用时,每个注解的属性都有确定的值。动态的实现这些方法时,只需要返回这些值即可
举个例子:
自定义注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface TestAnnotation {
String value();
}
使用注解:
@TestAnnotation(value = "hello")
public class Test {
}
动态生成类似于下面的类:
class TestAnnotationImpl implenments TestAnnotation{
public String value(){
return "hello";
}
}
获取注解对象
因为动态的生成了一个注解的对象,所以,只要“拿到”这个对象,就可以调用这个对象(注解)的方法来获取值。(例如上面调用value()方法就可以获得值)
获取注解对象,需要通过反射。只要拿到注解修饰的部分的反射对象,就可以拿到注解对象。
例如,上面的注解修饰的时Test类,所以通过Test.class对象就可以拿到注解对象。
TestAnnotation annotation = Test.class.getAnnotation(TestAnnotation.class);
除了Class对象,还可以通过Method对象获得修饰方法的注解对象,通过Filed对象获得修饰字段的注解对象。
获取注解的属性值
上面已经说过,拿到的注解对象实现了注解中的方法,只要通过调用注解(接口)中的方法,就可以得到值。
@TestAnnotation(value = "hello")
public class Test {
public static void main(String[] args) {
TestAnnotation annotation = Test.class.getAnnotation(TestAnnotation.class);
System.out.println(annotation.value());
}
}