1、概述
注解有点像接口(annotation 有点像 interface)
2、创建注解
package com.eimageglobal.common.biz.annotation;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
/**
* 注解有点像是接口
* @author chenyufeng
*
*/
@Retention(RUNTIME)
@Target(METHOD)
public @interface UseCase {
//注解元素可以是基本类型、String、Class、enum、Annotation
//及以上类型的数组
public int id() ;
public String description() default "no description";
public String[] versions() ;
}
2、注解的使用:在类、方法、属性等地方进行标注
package com.eimageglobal.common.biz.util;
import com.eimageglobal.common.biz.annotation.UseCase;
public class PasswordUtils {
//如何使用?
//小括号里面对注解元素进行赋值
@UseCase(id=47,description="Password must contains at least ome numeric",versions= {"1.0","3.0"})
public boolean validatePassword(String password) {
return password.matches("\\w*\\d\\w*");
}
//方法有default实现的可以不用赋值,会使用默认值
//如果是注解元素类型是数组,也可以直接用一个值,编译器会帮你转化为长度为1的数组
@UseCase(id=48,versions="2.0")
public String encryptPassword(String password) {
return new StringBuilder(password).reverse().toString();
}
}
3、注解处理器
package com.eimageglobal.common.biz.annotation.handler;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import com.eimageglobal.common.biz.annotation.UseCase;
import com.eimageglobal.common.biz.util.PasswordUtils;
/**
* 注解处理类
* @author chenyufeng
*
*/
public class UseCaseHandler {
public static void trackUseCases(List<Integer> useCases,Class<?> cl) {
for (Method method : cl.getDeclaredMethods()) {
UseCase useCase = method.getAnnotation(UseCase.class);
if (useCase!=null) {
System.out.println("Found User Case : " + useCase.id() + " versions:" +Arrays.toString(useCase.versions()));
useCases.remove(new Integer(useCase.id()));
}
}
for (Integer integer : useCases) {
System.out.println("Warning : Missing use case-"+integer);
}
}
public static void main(String[] args) {
List<Integer> useCases = new ArrayList<Integer>();
Collections.addAll(useCases, 47,48,49);
trackUseCases(useCases, PasswordUtils.class);
}
}