JDK注解知识入门

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:应用场景:日志、事务处理、缓存、性能统计、权限控制等等这些非业务的基础功能

posted @ 2012-10-22 11:39  行在途中  阅读(502)  评论(0编辑  收藏  举报