自定義註解【一】

一、背景

雖然經常使用註解,但是之前對於註解的原理什麼都不懂,然後看書寫了個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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章