自定义的注解,该注解没有任何成员变量,仅仅是一个标记Annotaion
package annotation_;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 仅仅是注解标记
* @desc 标记程序元素 是可以测试的
* @author 杨润康Bla
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Testable {
}
写一个用于测试标记注解的类
package annotation_;
/**
* 用于测试的目标类
* @author 杨润康Bla
*/
public class TargetTestClass {
//只要是使用 @Testable 注解标记的,都表明只是可测试
@Testable
public static void m1(){
System.out.println("Test....m1");
}
@Testable
public static void m2(){
System.out.println("Test....m2");
}
public static void m3(){
System.out.println("Test....m3");
}
@Testable
public static void m4(){
System.out.println("Test....m4");
}
@Testable
public static void m5(){
throw new IllegalArgumentException("m5 Exception...");//需要将异常抛出
}
public static void m6(){
System.out.println("Test....m6");
}
@Testable
public static void m7(){
throw new RuntimeException("m7 Exception..."); //需要将异常抛出
}
@Testable
public static void m8(){
System.out.println("Test....m8");
}
}
标记注解本身对程序是没有任何影响的,仅仅是标记作用,所以写一个注解的处理工具,让我们写的注解(标记注解或其他自定义、非自定义注解)产生实际作用
package annotation_;
import java.lang.reflect.Method;
/**
*注解处理工具
*/
public class AnnotationProcessorTool {
public static void process(String clazz) throws Exception{
Integer successCount = 0;
Integer failedCount = 0;
Method[] methods = Class.forName(clazz).getMethods();
for(Method method : methods){
if(method.isAnnotationPresent(Testable.class)){ //如果是被Testable注解类注解的
try {
method.invoke(null);
successCount++;
} catch (Exception e) {
System.out.println(method.getName() +"异常:"+ e.getCause());
failedCount++;
}
}
}
System.out.println("一共运行了" + (successCount+failedCount) + "个测试方法");
System.out.println("成功运行了" + successCount + "个测试方法");
System.out.println("失败了" + failedCount + "个测试方法");
}
}
最后,写个测试类测试一下吧
package annotation_;
public class MainTest {
public static void main(String[] args) throws Exception {
String clazz = TargetTestClass.class.getName();
AnnotationProcessorTool.process(clazz);
}
}