1、需求:创建一个自定义的Junit注解@MyTest
2、建测试类DemoTest.java
public class DemoTest1{
@MyTest
public void test1(){
s.o.p("test1执行了");
}
public void test2(){
s.o.p("test2执行了");
}
}
3、定义注释 @MyTest
public @interface MyTest{
}
4、利用反射机制,建立 @MyTest 的运行类
public class MyJunitRunner{
/*
* 反射注解思路:
* 取得类的字节码;
* 反射其中的成员,此处就是方法成员;
* 看谁的上面有 MyTest 注解
* 谁有就运行谁
*
*/
public static void main(String[] args) throws Exception{
// 取得类的字节码;
Class clazz = DemoTest1.class;
//反射其中的成员,此处就是方法成员;
Method methods[] = clazz.getMethods(); // 得到 DemoTest1 中所有共有的方法
//看谁的上面有 MyTest 注解
for(Method m: methods){
boolean b = m.isAnnotationPresent(MyTest.class);
s.o.p(b+"======="+m.getName());
//谁有就运行谁
if(b){
m.invoke(clazz.newInstance(), null);
}
}
}
}
5、此时运行,没有任何一个 b 会显示 true。原因为在步骤3 中没有给注解添加“元注解”:
@Retention(RetentionPolicy.RUNTIME)
@Target( (ElementType.FIELD; ElementType.MOTHOD) ) // 说明 MyTest 注解只能在字段或者方法上使用
public @interface MyTest{
}
6、再次运行,成功