springMVC里有很多注解 可是我看这些注解 都只是定义一些属性而已,怎么就能实现那么
牛逼的功能呢?
请问java中注解的功能是怎么实现的
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
9条回答
- guxiangfly 2017-01-02 06:48关注
通过自定义注解。。
额。。下面给出一个本菜鸟 写的一个 仿制 junit测试单元的一个 灰常简单的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方法 后 会在控制台输出以下保存了数据
更新了数据于此就得到了 测试那个被测试类的功能。。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 8无用