Java Annotation学习笔记
2013-07-19 03:22
393 查看
Java Annotation学习笔记
该学习笔记是基于Thinking in Java 4th Edition整理的。一. 什么是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标注
Java 1.5提供了一些基本的Annotation,比如@Override,如下是@Override的源码。@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }通过@Override标注可以看出,Annotation类似于一个interface的构造,只不过在interface的前面添加了@。
Java 1.5提供了四个基本的Annotation,用于构造其余新的Annotation。
4.2 四个基本标注
四个基本标注分别是@Target, @Retention, @Documented和@Inherited。@Target:用于声明自定义的Annotation所能标注的目标。该Annotation可取值为一个命为ElementType的枚举,该枚举包括以下值:
CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE。
@Retention:用于声明自定义的Annotation所添加的信息可以保持到什么阶段。该Annotation可取值为一个命为RetentionPolicy的枚举,该枚举包括以下值:
SOURCE, CLASS, RUNTIME。
@Documented:用于声明自定义的Annotation是否被添加到Javadoc中。列子之一就@Deprected标注。
@Inherited:用于声明自定义的Annotation是否可以被子类从父类中继承。(注意注解继承只针对class 级别注解有效)
五. 一个完整的Annotation实例(来源于Thinking in Java,Page 762)
该实例主要通过创建一个@UseCase并将其标注于方法上来达到获取项目进度的目的。@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
简单的Annotation学习笔记完毕。对于Annotation的理解有助于对Spring,Hibernate等基于标注的配置方式的理解。
后期还要记得补充利用apt工具来解析Annotation。
相关文章推荐
- Java中Annotation(注释)系列学习笔记(1)
- Java中Annotation(注释)系列学习笔记(4)
- Java学习笔记(52)-----------Annotation(注释)第一篇
- Java中Annotation(注释)系列学习笔记(2)
- Java学习笔记(53)------------Annotation(注释)第二篇
- Java Annotation学习笔记
- Java中Annotation(注释)系列学习笔记(3)
- Java注解Annotation学习笔记
- Java 学习笔记05:Spring 基于注解(Annotation)的IOC
- Java --Annotation学习心得体会及笔记
- Java学习笔记—注解(Annotation)的用法
- Java中Annotation(注释)系列学习笔记(4)
- Java中Annotation(注释)系列学习笔记(1)
- Java 学习笔记06:Spring 基于注解(Annotation)的AOP
- java学习笔记11--Annotation
- Java --Annotation学习心得体会及笔记
- Java学习笔记5——Annotation
- 关于java annotation的学习笔记。。。
- 学习笔记之Java Annotation学习总结 [ 光影人像 东海陈光剑 的博客 ]
- java学习笔记11--Annotation