Annotation:注解

Annotation:注解

它本身是个接口,所有Annotation类都必须实现该接口,默认实现

系统内建的三个Annotation

1、@Override:覆写的Annotation
2、@Deprecated:不赞成使用的Annotation
3、@SuppressWarniings:压制安全警告的Annotation

@Override:可保证覆写方法的正确性,如果不是覆写方法,加了@Override程序会报错

@Deprecated:不建议使用,编译时不会出错,运行时会报不建议使用警告

@SuppressWaniings:
示例:@SuppressWarnings(“unchecked”)或者多个时@SuppressWarnings({“unchecked”,”deprecation”})

自定义Annotation

定义多个参数

public @interface BindLayout {

     int layout();
     int view();
     String[] names(); //定义数组
}

也可以声明默认值,使用时可以不写

public @interface BindGet {
   String param() default "小明";
}

使用时@BindGet()或者直接@BindGet

@BindGet()
  void getUserUrl(String name){
    Log.i("BindGet",name);
}

固定值限制使用范围

可以使用Enum枚举
示例代码:

public enum MyNameEnum {  
  XIAOMING,  
  XIAOHONG,  
   XIAOHUA
}  

定义Annotation

public @interface MyAnnotationEnum {

    MyNameEnum name();

}

使用

 @MyAnnotationEnum(name = MyNameEnum.XIAOHONG)  

@Retention 指定Annotation的保存范围

使用Retention定义一个Annotation的保存范围
SOURCE:此Annotation类型的信息只会保存在程序源文件之中(.java),编译之后不会保存在编译好的类文件(.class)之中
@Retention(RetentionPolicy.SOURCE)

如:Override,SuppressWanings

CLASS:会保存到.java和.class文件中,但不会随着执行加载到虚拟机JVM中,默认指定
@Retention(RetentionPolicy.CLASS)

RUNTIME:会保存到.java和.class文件中,在执行时也会加载到JVM之中
@Retention(RetentionPolicy.RUNTIME)
在类执行时依然有效,自定义都用这种类型

示例:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface BindGet {
     String param() default "小明";
}

@Target

指定注释的使用位置
没有明确说明的可以在任意地方使用
ElementType.FIELD 只能用在字段声明上
ElementType.METHOD 只能用在方法上
ElementType.TYPE 只能用在类,接口,枚举类型上

还有其他的使用范围,具体查API文档

示例代码
@Target(ElementType.FIELD)

多个地方可以使用可以这样声明:
@Target({ElementType.FIELD,ElementType.METHOD})

@Documented

进行注释的,而且在生成javadoc的时候可以通过@Documented设置一些说明信息
示例:
/**

  • 此方法在对象输出是调用,返回对象信息
    */
    @MyDocumentedAnnotation(key = “xiaoming”)
    public String toString(){

}
之后通过javadoc命令,生成java doc文档,在文档就能看到此方法在对象输出是调用,返回对象信息 这句话

@Inherited

此注释表示一个Annotation是否可以被继承下来

简单的说在定义Annotation时,加上@Inherited,在使用时父类使用了该Annotation,它的子类也默认使用
示例代码:
@MyAnnotation
class Person{

}

class Student extends Person{
}
Student也是拥有此@MyAnnotation