修饰Annotation的Annotation:
Target:用来说明该注释可以出现的位置。
@Target(value={ElementType.TYPE,ElementType.METHOD,Element.FIELD})分别表示可以出现在类上、方法上和成员变量上。其中value可以省略
Retention:用来修饰注释可以保留到什么时候。
@Retention(RetentionPolicy.RUNTIME)表示可以保留到运行时。RetentionPolicy.CLASS表示保留到字节码,RetentionPolicy.SOURCE表示保留到元代码
Annotation的定义:
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})//表示可以出现在类、方法和成员变量上。
public @interface Test {
public String value();
public int age()default 20;
}
运用:
@Test(value = "abc",age = 20)
public class Demo02 {
}
Annotation的应用:可以通过反射来获取类上的、方法上的和成员变量变量上的Annotation对象,这些对象中就有定义Annotation时所加的属性以及运用时所赋予的值。
定义Annotation:
@Retention(RetentionPolicy.RUNTIME)//保留到运行时,否则通过反射不会的到该注释。
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
public @interface MyAnno {
public String name();
public int age();
}
运用Annotation:
public class test {
@MyAnno(name = "张三",age = 20)//对Annotation中的属性进行赋值
public void bb()
{
System.out.println("This is bb method");
}
}
通过反射来获取Annotation中的信息:
public class Main {
public static void main(String[] args)throws Exception {
Class testclass=test.class;
Method[] methods=testclass.getDeclaredMethods();
for(Method method:methods)
{
Annotation myAnno=method.getDeclaredAnnotation(MyAnno.class);
if(myAnno!=null)
{
method.invoke(testclass.newInstance(),new Object[]{});//因为不是静态方法,因此要有实例对象。
MyAnno myAnno1=(MyAnno) myAnno;
System.out.println(myAnno1.name());
System.out.println(myAnno1.age());
}
}
}
}
Method、Field、Class类的对象都可以调用获得Annotation对象的方法。