一、背景
雖然經常使用註解,但是之前對於註解的原理什麼都不懂,然後看書寫了個demo,算是初窺其面目。
二、例子
package cn.sp.test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ExceptionTest {
Class<? extends Exception> value();
}
package cn.sp.test;
public class Sample2 {
@ExceptionTest(ArithmeticException.class)
public static void m1(){//Test should pass
int i=0;
i=i/i;
}
@ExceptionTest(ArithmeticException.class)
public static void m2(){// should fail
int[] a = new int[0];
int i = a[1];
}
@ExceptionTest(ArithmeticException.class)
public static void m3(){// should fail(no exception)
}
}
package cn.sp.test;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class RunTest {
public static void main(String[] args) throws Exception {
int tests = 0;
int passed = 0;
Class<?> testClass = Class.forName(args[0]);//cn.sp.test.Sample2
for (Method m :testClass.getDeclaredMethods()) {
if(m.isAnnotationPresent(ExceptionTest.class)){
tests++;
try {
m.invoke(null);
System.out.printf("Test %s failed:no exception%n",m);
} catch (InvocationTargetException e) {
Throwable exc = e.getCause();
Class<? extends Exception> excType = m.getAnnotation(ExceptionTest.class).value();
if(excType.isInstance(exc)){
passed++;
}else{
System.out.printf("Test %s failed:excepted %s, got %s%n",m,excType.getName(),exc);
}
} catch (Exception e) {
// TODO: handle exception
System.out.printf("INVALID @Test:"+m);
}
}
}
System.out.printf("Passed:%d ,Failed:%d%n",passed,tests-passed);
}
}
Test public static void cn.sp.test.Sample2.m3() failed:no exception
Test public static void cn.sp.test.Sample2.m2() failed:excepted java.lang.ArithmeticException, got java.lang.ArrayIndexOutOfBoundsException: 1
Passed:1 ,Failed:2