1.自定义注解类
实验目的是希望使用NeedTest注解对业务类的方法进行标注,以便测试工具可以根据注解情况激活或关闭对业务类的测试。在编写好NeetTest注解类后,就可以在其他类中使用了
Java新语法规定使用@interface修饰定义注解类,一个注解类可以拥有多个成员,成员声明和接口方法声明类似。成员声明有以下几点限制:
(1)成员以无入参无抛出异常的方式声明。
(2)可以通过default为成员指定一个默认值。
(3)成员类型是受限的,合法的类型包括原始类型及其封装类、String、Class、enums、注解类型,以及上述类型的数组类型。
Ps: @Retention(RetentionPolicy.RUNTIME) : 表示NeedTest这个注解可以在运行期被JVM读取。
@Target(ElementType.METHOD) : 表示NeedTest这个注解只能应用到目标类的方法上。
package com.aspectj; 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 NeedTest { boolean value() default true; }
2.使用注解
在ForumService中使用NeedTest注解,标注业务方法是否需要测试。
package com.aspectj; public class ForumService { @NeedTest(value = true) public void deleteForum(int forumId){ System.out.println("删除论坛模块:" + forumId); } @NeedTest(value = false) public void deleteTopic(int poostid){ System.out.println("删除论坛主题:" + poostid); } }
3.访问注解
通过方法的反射对象,获取方法上所标注的NeedTest注解对象,接着就可以访问注解对象的成员,从而得到ForumService类方法的测试需求。
package com.aspectj; import java.lang.reflect.Method; public class TestTool { @SuppressWarnings("unchecked") public static void main(String[] args) { Class clazz = ForumService.class; Method[] methods = clazz.getDeclaredMethods(); for (Method method : methods) { NeedTest nt = method.getAnnotation(NeedTest.class); if (nt != null) { if (nt.value()) { System.out.println(method.getName() + "()需要测试!"); } else { System.out.println(method.getName() + "()不需要测试!"); } } } } }
运行结果:
deleteForum()需要测试!
deleteTopic()不需要测试!
ps:应用场景:日志、事务处理、缓存、性能统计、权限控制等等这些非业务的基础功能