注解学习笔记
2016-02-27 本文已影响115人
Twinkle_______
文章大部分内容转载于 尚学堂-高琪-java视频教程ppt。
Annotation的作用:
- 不是程序本身,可以对程序作出解释(这一点,跟注释没什么区别)
- 可以被其他程序(比如:编译器)读取。(注解信息处理流程,是注解和注释的重大区别). 如果没有注解信息处理流程,则注解毫无意义。
Annotation在哪里使用:
- 可以附加在package class method field 等上面, 相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程对这些元数据的访问.
- 常见注解:
@Override(标记注解, 里边什么也没有)
@Deprecated
@SuppressWarnings
看@Override的源码:
@Target(ElementType.METHOD) // 表示只能应用在方法前面(METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
自定义注解
使用@interface自定义注解时,自动继承java.lang.annotation.Annotation接口
要点:
- @interface 用来声明一个注解*
格式为: public @interface 注解名 {定义体}
- 其中的每一个方法实际上是声明了一个配置参数
~ 方法的名称就是参数的名称
~ 返回值类型就是参数的类型(返回值类型只能是 基本类型, Class, String, enum )
~ 可以通过default来声明参数的默认值
~ 如果只有一个参数成员, 一般参数名为value
- 注意:
- 注解元素必须要有值.我们定义注解元素时,经常使用 空字符串, 0作为默认值
- 也经常使用负数(比如: -1)表示不存在的含义
元注解:
- 元注解的作用 就是负责注解其他注解. Java定义了4个标准的meta-annotation类型,它们被用来提供对其它Annotation类型作说明
- 这些类型和它们所支持的类在java.lang.annotation包中可以找到
@Target
@Retention
@Documented
@Inherited
@Target :
- 作用
- @Target(value=ElementType.TYPE)
- 用于描述注解的使用范围(被描述的注解可以用在什么地方)
所修饰范围 | 取值ElementType |
---|---|
package 包 | PACKAGE |
类、接口、枚举、Annotation类型 | TYPE |
类型成员(方法、构造方法、成员变量、枚举值) | CONSTRUCTOR:用于描述构造器<br />FIELD:用于描述域<br />METHOD:用于描述方法 |
方法参数和本地变量 | LOCAL_VARIABLE:用于描述局部变量<br />PARAMETER:用于描述参数 |
@Retention :
- 作用
- 表示需要在什么级别保存该注释信息,用于描述注解的生命周期。
取值 RetentionPolicy | 作用 |
---|---|
SOURCE | 在源文件中有效(即源文件中保留) |
CLASS | 在class文件中有效(即class保留) |
RUNTIME | 运行时有效(运行时保留)<br />为Runtime可以被反射机制读取 |
对于SOURCE和CLASS,编译器会去使用它们,而通过反射就读取不到了。
Example :
// AnnotationDIY.java
//@Target(value = ElementType.METHOD) //表示这个注解只能放在方法前面
@Target(value = {ElementType.METHOD, ElementType.TYPE}) //类变量和方法都可以修饰
@Retention(RetentionPolicy.RUNTIME) // RUNTIME 反射机制读取注解
public @interface AnnotationDIY {
// String hometown(); // hometown 是参数名, String 是参数的类型. 不给默认值,使用注解时,要赋一个值
String hometown() default ""; // default 表示给参数一个默认值
int distance() default 0;
int id() default -1; //不给id传值得话, id就不存在
String[] rivers() default {"changjiang", "huanghe"};
}
//AnnotationDIY1.java
@Target(value = {ElementType.METHOD, ElementType.TYPE}) //类变量和方法都可以修饰
@Retention(RetentionPolicy.RUNTIME) // RUNTIME 反射机制读取注解
public @interface AnnotationDIY1 {
String value(); // 只有一个参数的话,一般定义为 value
}
// 使用注解 AnnotationDIYDemo.java
public class AnnotationDIYDemo {
@AnnotationDIY(distance = 10000, hometown = "Chongqing", id = 23) //为注解中的参数赋值
public void goHome() {
}
// @AnnotationDIY1(value = "you")
@AnnotationDIY1("you") //不加value参数名也可以
public void missYou() {
}
}
参考文章:
http://blog.csdn.net/javazejian/article/details/71860633