注解是Java引入的一項提供了一種結(jié)構(gòu)化的,并且具有類型檢查能力的新功能,這使得程序員能夠為代碼加入元數(shù)據(jù),而不會導(dǎo)致代碼雜亂且難以閱讀。
??自從java有了注解,使得spring等框架變的更受歡迎了,它使我們的編碼體驗發(fā)生了巨大改變。
?? java中有一些自帶的注解,例如@Override,@SuppressWarnings等,但是,很多小伙伴不知道如何創(chuàng)建注解,這里我們就來了解一下。
??假如我們要創(chuàng)建一個@helloworld的注解,首先需要:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {}
其中需要使用元注解(即定義注解的注解,這是jdk定義好的)定義此注解的基本信息。@Target用來定義此注解將應(yīng)用于什么地方(方法或域)。@Rectetion用來定義該注解在哪一個級別可用,SOURCE(在源代碼中),CLASS(類文件),RUNTIME(運行時)。
??在空注解的基礎(chǔ)上加入兩個類似方法的定義:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase {
public int id();
public String description() default "no description";
}
public class PasswordUtils {
@UseCase(id = 47,description = "密碼必須包含數(shù)字")
public boolean vaPass(String pass){
return (pass.matches("\\w*\\d\\w*"));
}
@UseCase(id = 48)
public String enPass(String pass){
return new StringBuilder(pass).reverse().toString();
}
@UseCase(id = 49,description = "新密碼不能等于使用過的密碼")
public boolean checkNPass(List<String> prevPass,String pass) {
return !prevPass.contains(pass);
}
public static void main(String[] args) {
PasswordUtils pu = new PasswordUtils();
pu.vaPass("123");
}
}
注解的元素在使用時表現(xiàn)為名-值對的形式,如果沒有使用id或description,那么將會用到其默認值(default)。id沒有默認值,應(yīng)該是不能沒有值的。
元注解
java里面目前內(nèi)置了四種元注解,專職負責(zé)注解其他的注解,一般程序員會定義自己的注解,并編寫自己的處理器來處理它們。
??四種元注解

編寫注解處理器
使用注解時很重要的一個部分就是創(chuàng)建與使用注解處理器。我們可以使用反射這類工具,java 還提供了一個外部工具apt來幫助程序員解析帶有注解的java源代碼。
??一個簡單的注解處理器
public class UseCaseTracker {
public static void
trackUseCases(List<Integer> useCases,Class<?> cl) {
for(Method m : cl.getDeclaredMethods()) {
UseCase uc = m.getAnnotation(UseCase.class);
if(uc != null) {
System.out.println("Found Use Case:" + uc.id()
+" " +uc.description());
useCases.remove(new Integer(uc.id()));
}
}
for(int i : useCases) {
System.out.println("Warning: Missing use case-" + i);
}
}
public static void main(String[] args) {
List<Integer> useCases = new ArrayList<Integer>();
Collections.addAll(useCases, 47,48,49,50);
trackUseCases(useCases, PasswordUtils.class);
}
}
getDeclaredMethods()方法返回類的方法。
??getAnnotation()方法返回指定類型的注解對象,在本文中就是UseCase。如果被注解的方法上沒有該類型的注解,則返回null值。