注解
1、注解(元数据):可以提供用来完整地描述程序所需的信息,这些信息是无法使用Java来表达的;能够将以编译器来测试和验证的格式,储存有关程序的额外信息;
2、注解的语法除了@符号以外,基本与Java固有的语法一致,Java SE5在java.lang内置了3种标准注解和4种元注解:
(1)标准注解:
@Override:表示当前的方法定义将覆盖超类中的方法,当方法签名对不上被覆盖方法时,编译器会发出错误的提示;
@Deprecated:如果程序员使用了注解为它的元素,编译器会发出警告信息;
@SuppressWarnings:关闭不当的编译器信息;
(2)元注解:负责注解其他注解;

(3)注解元素
注解元素中可用的类型如下:
①所有的基本类型(int,float,boolean等);
②String
③Class
④enum
⑤Annotation
3、定义注解
(1)Java的注解定义和接口很相似,与其他任何Java接口一样,注解也会被编译成.class文件;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase{
public int id()
default -1;
public String description()
default "no description";
}
(2)元素不能有不确定的值,元素必须要有默认值,要么要在使用注解时提供元素的值,在定义默认值时,不能使用null;
4、注解的使用
public class PasswordUtils{
@UseCase(id = 47,description = "Password must contain at least one numeric")
public boolean validatePassWord(String password){
return (password.matches("\\w*\\d\\w*"));
}
@UseCase(id = 48,description)
public String encryptPassWord(String password){
return new StringBuilder(password).reverse().toString();
}
@UseCase(id = 49,descirption = "New password can't euqal previously used ones")
public boolean checkForNewPassword(List<String> prePasswords, String password){
return !prePaswords.contains(password);
}
}
5、编写注解提取器
public class UseCaseTracker{
/*useCases记录所有待检查UseCase注解的编号,type为待提取UseCase注解的类文件,
同时检验在useCases上有哪些注解不存在与type上面;*/
public static void trackUseCast(List<Integer> useCases,Class<?> type){
for(Method method : type.getDeclaredMethods()){ //获取type类上的所有方法
UseCase uc = method.getAnnotation(UseCase.class); //获取每一个方法上的UseCase注解
if(uc != null)
System.out.println("Founds Use Case : "+uc.id() +" "+uc.description() );
useCases.remove(new Integer(uc.id())); //排除useCases上以检查的UseCase注解
}
for(int i : useCases )
System.out.println("Warning : Missing use case "+ i); //打印所有没有被检查到的UseCase注解
}
//Test
public static void main(){
List<Integer> useCases = new ArrayList<Integer>();
Collections.addAll(useCases,47,48,49,50);
trackUseCases(useCases,PasswordUtil.class);
}
}