自定义注解【一】

一、背景

虽然经常使用注解,但是之前对于注解的原理什么都不懂,然后看书写了个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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值