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);
}
}