自定义注解【一】

来源:互联网 发布:soap json 编辑:程序博客网 时间:2024/05/24 06:40

一、背景

虽然经常使用注解,但是之前对于注解的原理什么都不懂,然后看书写了个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 passint i=0;i=i/i;}@ExceptionTest(ArithmeticException.class)public static void m2(){// should failint[] 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.Sample2for (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 exceptionSystem.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 exceptionTest public static void cn.sp.test.Sample2.m2() failed:excepted java.lang.ArithmeticException, got java.lang.ArrayIndexOutOfBoundsException: 1Passed:1 ,Failed:2



0 0
原创粉丝点击