什么是注解?
注解,也被称为元数据(描述数据的数据<==>data about data).在Java1.5中被引入.注解可以将元数据保存在Java源代码中,并利用annotation API为自己的注解构造处理工具.此外,注解的优点还包括:更加干净易读的代码以及编译期类型检查等.
三种内置注解
@Override : 表示当前的方法覆盖超累中的方法.如果方法签名对不上,编译器就会发出错误提示.
@Deprecated : 标在方法上表示方法已弃用(也可以说是表示已过期).
@SuppressWarnings : 关闭不当的编译器警告.
四种元注解
元注解专门负责新注解的创建,在自建注释时使用
@Target : 表示该注解可以用于什么地方.主要的ElementType参数包括:
CONSTRUCTOR : 构造器的声明
FIELD : 域(属性)声明,包括enum实例
LOCAL_VARIABLE : 局部变量声明
METHOD : 方法声明
PACKAGE : 包声明
PARAMETER : 参数声明
TYPE : 类,接口(包括注解类型)或enum声明
@Target注解可以指定多个ElementType,用逗号分隔,表示能应用于多个类型,如果省略掉@Target注解不用,则表示该注解可应用于所有的ElementType
@Retention : 用来规定注解在哪一个级别可用,可选的RetentionPolicy参数包括:
SOURCE : 源代码中,注解将被编译器丢弃.
CLASS : 类文件中,会被VM丢弃.
RUNTIME : 运行时,VM将在运行期也保留注解,因此可以通过反射机制读取注解的信息.
@Documented : 将此注解包含在javadoc中
@Inherited : 允许子类继承父类中的注解
自定义注解示例
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) // @interface 表示声明一个注解 // Test 是自定义注解的注解名 public @interface Test { // 声明注解的元素,写法类似于接口的方法 public int value(); // 可以用default关键字为元素设定默认值 public String description() default "no description"; // *默认值限制* : 元素必须有值,要么具有默认值,要么使用注解时提供元素的值. // 默认值不能为null,为了绕开这个约束,我们可以定义一些特殊的值,例如空字符串 // 或者负数,以此表示某个元素不存在; public String company() default ""; public int age() default -1; // *注解元素的可用类型* // 所有基本类型(int, boolean, float等) // String // Class // enum // Annotation (注解也可以作为元素的类型,也就是说注解可以嵌套) // 以上类型的数组 // 如果使用其他类型,编译器就会报错 // 注解不支持继承,但可以在注解内嵌套注解实现相同的功能 public TestAnnotation testAnno() default @TestAnnotation(name="LiSi"); // 快捷方式 : 如果注解只有value元素没有默认值,其他元素全都有默认值 // 即在应用该注解时,value元素是唯一需要赋值的一个元素 // 那么在使用value注解时,无需使用名-值对的方法, // 直接在括号内给出value元素所需的值即可(必须将此元素命名为value) // 例如 : @RequestMapping("/login") // 没有元素的注解被称为标记注解(marker annotation) }
1.默认值限制
2.注解元素可用类型
3.注解不支持继承
4.快捷方式
5.标记注解
注解的使用
参考Spring, SpringMVC中注解的使用.或者比如@Override注解.
注解处理器
未完待续
使用apt处理注解
未完待续
Thinking in Java读到了629页