注解学习笔记

文章大部分内容转载于 尚学堂-高琪-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:用于描述构造器
FIELD:用于描述域
METHOD:用于描述方法
方法参数和本地变量 LOCAL_VARIABLE:用于描述局部变量
PARAMETER:用于描述参数
@Retention :
  • 作用
  • 表示需要在什么级别保存该注释信息,用于描述注解的生命周期。
取值 RetentionPolicy 作用
SOURCE 在源文件中有效(即源文件中保留)
CLASS 在class文件中有效(即class保留)
RUNTIME 运行时有效(运行时保留)
为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

你可能感兴趣的:(注解学习笔记)