一个简单的自定义注解的实现

时间:2021-07-02 20:41:34

大家知道,在javaee各技术里面,注解被广泛的使用。那么注解是如何实现的呢?

额。。下面就给出一个本菜鸟 写的一个 仿制 junit测试单元的一个 灰常简单的myTest注解(本人学僧,第一次写博客,希望大家多提宝贵意见。。)

 /**
*
*/
package com.guxiang.test;
 /**
*
*/
package com.guxiang.test;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

首先自定义一个 myTest注解
/**
* @author guxiang
* @date 2016年12月24日 下午10:22:11
* 自定义的myTest注解
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.ANNOTATION_TYPE})
public @interface MyTest {
long time() default -1;
}


写一个类 用于被myTest注解 实现测试

 package com.guxiang.test;

public class SomeDaoImpl {
public void save(){
System.out.println("保存了数据");
}
public void update(){
System.out.println("更新了数据");
}
}


写一个测试类 这个类 引用myTest注解

 package com.guxiang.test;
public class SomeDaoImplTest {

private SomeDaoImpl dao= new SomeDaoImpl();
/**
* 测试添加
*/
@MyTest
public void testAdd(){
dao.save();
}

@MyTest
public void testUpdate(){
dao.update();
}
}


最关键的 一步 写一个 myTestRunner类 使用反射实现注解的功能 给注解注入灵魂

 /**
*
*/
package com.guxiang.test;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
* @author guxiang
* @date 2016年12月24日 下午10:26:07
*/

// 反射注解
public class MyTestRunner {
public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
Class clazz = SomeDaoImplTest.class;
Method[] ms = clazz.getMethods();
for (Method method : ms) {
boolean hasMyTest = method.isAnnotationPresent(MyTest.class);
if (hasMyTest) {
method.invoke(clazz.newInstance(), null);
}
}
}
}


这个测试类仿制了 junit测试单元 
执行MyTestRunner 的main方法 后 会在控制台输出以下

保存了数据
更新了数据

于此就得到了 测试那个被测试类的功能。。