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