自定义接口

自定义接口实现类似于枚举的功能

1
2
3
4
5
6
7
8
9
10
11
import android.support.annotation.IntDef;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.SOURCE)
@IntDef({PageTypeAnn.HOME_PAGE, PageTypeAnn.FOUND_PAGE, PageTypeAnn.CUSTOM_PAGE})
public @interface PageTypeAnn{
int HOME_PAGE = 0;
int FOUND_PAGE = 1;
int CUSTOM_PAGE = 2;
}

@Retention限制存在的时间

@IntDef限制传入的数据。(@StringDef、@LongDef)

元注解

可以理解为最根本的注解,其他的注解是可以由此来衍生的,作用就是注解其他注解。

在Java5中有几个元注解:

  1. @Target

    说明Annotation所修饰的对象范围。用于描述注解的使用范围(即:被描述的注解可以用在什么地方)

    Annotation可被用于:

    • packages
    • types(类、接口、枚举、Annotation类型)
    • 类型成员(方法、构造方法、成员变量、枚举值)
    • 方法参数
    • 本地变量(循环变量、catch参数等)

    取值(ElementType)有:

    • CONSTRUCTOR:用于描述构造器
    • FIELD:用于描述域
    • LOCAL_VARIABLE:用于描述局部变量
    • METHOD:用于描述方法
    • PACKAGE:用于描述包
    • PARAMETER:用于描述参数
    • TYPE:用于描述类、接口(包括注解类型)或者enum声明
  2. @Retention

    定义该Annotation被保留的时间长短:有些Annotation仅出现在源代码中,被编译器丢弃;有些被编译在class文件中;编译在class中的Annotation可能会被虚拟机忽略,也有在class被装载时被读取(PS:不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对Annotation的“生命周期”限制。

    作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)

    取值(RetentionPoicy)有:

    • SOURCE:在源代码中有效。注解的信息会被编译器抛弃,不会留在class文件中
    • CLASS:在class文件中有效。注解的信息被保留在class文件(字节码文件)中,但编译时不会被虚拟机读取在运行时。
    • RUNTIME:在运行时有效。注解的信息被保留在class文件(字节码文件)中,当程序编译时,会被虚拟机保留在运行时。
  3. @Documented

    用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。

  4. @Inherited

    是个标记注解。阐述某个被标记的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

    注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。

    当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。