Java Annotation学习笔记
一. 什么是Annotation
Annotation是Java 1.5以后所具有的新的特性。Annotation提供了一种格式化的标注代码的途径,它为包,接口,类,或者方法提供的额外的信息。所有Annotation也被称作为metadata。
二. 为什么使用Annotation
Annotation可以方便地将针对代码的信息加入源代码中。在大大降低程序配置文件复杂程度的同时,也为程序员提供了方便直观的阅读方式。随主Java 1.5的这个新特性的到来,Spring,Hibernate,Junit等等都提供基于Annotation的配置方式。
三. Annotation怎么工作
如果简单的将Annotation添加到源代码中,那么Annotation是不可以工作的。所以必须创建Annotation processor class来解析Annotation。Annotation processor的基础是Java的反射机制,它通过在runtime的动态读取Annotation来决定程序的运行状态。
四. Annotation的构造
4.1 @Override标注
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}通过@Override标注可以看出,Annotation类似于一个interface的构造,只不过在interface的前面添加了@。4.2 四个基本标注
五. 一个完整的Annotation实例(来源于Thinking in Java,Page 762)
@UseCase的创建:
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase {
public int id();
public String description() default "no description";
}
利用@UseCase来标注PasswordUtils.class
import java.util.*;
public class PasswordUtils {
@UseCase(id = 47, description =
"Passwords must contain at least one numeric")
public boolean validatePassword(String password) {
return (password.matches("\\w*\\d\\w*"));
}
@UseCase(id = 48)
public String encryptPassword(String password) {
return new StringBuilder(password).reverse().toString();
}
@UseCase(id = 49, description =
"New passwords can’t equal previously used ones")
public boolean checkForNewPassword(
List<String> prevPasswords, String password) {
return !prevPasswords.contains(password);
}
}
创建UseCaseTracker.class,用来解析被标注的PasswordUtils.class
import java.lang.reflect.*;
import java.util.*;
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);
}
}
输出:
Found Use Case:47 Passwords must contain at least one numeric
Found Use Case:48 no description
Found Use Case:49 New passwords can’t equal previously used ones
Warning: Missing use case-50
2716



被折叠的 条评论
为什么被折叠?



