最近在学Spring,发现Spring里面使用了注解(annotation),非常好奇这里面是什么原理!于是就稍微的研究 下其底层的实现原理,然后突然发现junit使用的也是注解的方式,所以决定自定义一个简单版本的junit框架。下面就对junit的实现原理进行分析:
一、首先我们需要先对junit的注解进行声明
我这里就选择了常用的三个注解
@Test、@Before、@After
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value=ElementType.METHOD)//作用域为方法
@Retention(RetentionPolicy.RUNTIME)//注解信息保留到运行时
public @interface Before {
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value=ElementType.METHOD)//作用域为方法
@Retention(RetentionPolicy.RUNTIME)//注解信息保留到运行时
public @interface Test {
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value=ElementType.METHOD)//作用域为方法
@Retention(RetentionPolicy.RUNTIME)//注解信息保留到运行时
public @interface After {
}
二、定义一个注解信息处理流程
在这里使用了反射的机制来获取对象被注解方法,并且激活这个方法。
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class Junit {
//传入一个对象实例
public static void run(Class c) throws InstantiationException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException {
Method[] methods = c.getDeclaredMethods();//获取对象声明的方法集合
List<Method> testList = new ArrayList<Method>();//@Test注解的方法集合
Method afterMethod = null;//@After注解方法
Method beforeMethod = null;//@Before的注解方法
for (Method method : methods) {//循环对象声明的所有方法
//如果有@Test注解,则将该方法加入到Test注解的方法集合
if (method.isAnnotationPresent(Test.class)) {
testList.add(method);
}
//如果有@Before注解,则引用该方法
if (method.isAnnotationPresent(Before.class)) {
beforeMethod = method;
}
//如果有@After注解,则引用该方法
if (method.isAnnotationPresent(After.class)) {
afterMethod = method;
}
}
//new一个对象实例
Object obj = c.newInstance();
//反射激活方法
for (Method m : testList) {
if (beforeMethod != null) {
beforeMethod.invoke(obj, null);
}
m.invoke(obj, null);
if (afterMethod != null) {
afterMethod.invoke(obj, null);
}
}
}
三、新建一个测试类
public class TestPrductor {
@Before
public void testBefore(){
System.out.println("测试before");
}
@Test
public void testAdd(){
System.out.println("测试添加");
}
@Test
public void testDel(){
System.out.println("测试删除");
}
@After
public void testAfter(){
System.out.println("测试after");
}
}
四、运行这个测试类
import java.lang.reflect.InvocationTargetException;
public class JunitTest {
public static void main(String args[]) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
Junit.run(TestPrductor.class);
}
}
结果如图:
程序源码下载地址:http://download.csdn.net/detail/q5841818/8979275
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/q5841818/article/details/47364139