注解定义
@Retention(value=RetentionPolicy.RUNTIME)//元注解:Java中用来修饰其他注释的注释
① public @interface MyTest { }
元注解方法内传入一个枚举分别有三个值
:RetentionPolicy.SOURCE:源文件阶段
value=RetentionPolicy.CLASS:字节码阶段
RetentionPolicy.RUNTIME:运行阶段(创建对象阶段)
有三个值的原因是:类的存在有三个阶段,原始.java 编译后.class 对象创建
源代码阶段:以.java结尾的文件的形式存在,通过Class.forName(“类名”)方法获得
字节码阶段:将字节码文件编译后以.class结尾的文件存在,通过类名.class方式获取
创建对象阶段:JVM将字节码文件加载进内存的方法区内,通过对象.getClass方法获得
myTest的自定义注解:
//自定义注解核心运行类
/**
* 获得测试类的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);
}
}
}
}
原文:https://blog.csdn.net/Chicbrother/article/details/78463260