自定义注解
步骤分析
【步骤一】:创建自定义注解:MyTest
【步骤二】:定义核心运行类.CoreRunner
【步骤三】:在核心运行类中.获得测试类的Class
【步骤四】:获得Class中的所有方法.遍历得到每个方法.
判断方法上有MyTest注解,就执行该方法.
//自定义注解类
@Retention(value=RetentionPolicy.RUNTIME)//元注解①
public @interface MyTest {
}
①元注解:Java中用来修饰其他注释的注释
@Retention(value=RetentionPolicy.RUNTIME)
方法内传入一个枚举分别有三个值
RetentionPolicy.SOURCE:源文件阶段
value=RetentionPolicy.CLASS:字节码阶段
RetentionPolicy.RUNTIME:运行阶段(创建对象阶段)
用与设置注解的存在阶段,默认的自定义注解存在与源码阶段 在生成class文件后以及创建对象阶段就不存在了,所以需要将注解存在阶段延长
补充:类的存在有三种阶段对应的也有三种获取的方式
源代码阶段:以.java结尾的文件的形式存在
通过Class.forName(“类名”)方法获得
字节码阶段:将字节码文件编译后以.class结尾的文件存在
通过类名.class方式获取
创建对象阶段:JVM将字节码文件加载进内存的方法区内
通过对象.getClass方法获得
//测试类
public class AnnotationDemo1 {
@MyTest
public void demo1(){
System.out.println("demo1执行了...");
}
@MyTest
public void demo2(){
System.out.println("demo2执行了...");
}
public void demo3(){
System.out.println("demo3执行了...");
}
}
//自定义注解核心运行类
/**
* 获得测试类的Class.
* 获得Class中的所有的方法.
* 遍历每个方法,查看每个方法上是否有MyTest注解.
* 有MyTest注解,这个方法就执行.
*/
public class CoreRunner {
public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
// 1.获得测试类的Class:
Class clazz = AnnotationDemo1.class;
// 2.获得Class中的所有的方法: 规定了测试的方法必须是public.
Method[] methods = clazz.getMethods();
// 3.遍历每个方法:
for(Method method:methods){
boolean flag = method.isAnnotationPresent(MyTest.class);//②
if(flag){
// 说明方法上有MyTest注解:
method.invoke(clazz.newInstance(), null);
}
}
}
}
②boolean isAnnotationPresent(Class<? extends Annotation> annotationClass):
判断指定类型的注释是否存在于此元素上 是则返回 true,否则返回 false。