前言
Java的反射和注解是Java和Android程序员必须掌握的技术,注解使程序员可以将重复冗余的工作封装到一个框架里面,提供一个简单的API接口给程序使用,典型的有黄油刀(ButterKnife)、ARouter、EventBus等都使用了注解。这些优秀的框架都是使用了注解来提供一些包、类、方法、成员变量的辅助信息,然后程序使用反射机制来读取这些注解信息,然后做一些事,比如黄油刀会通过注解来读取到控件的ID,然后框架去实现findViewById()方法,让程序员不再一遍又一遍的写findViewById了。下面就让我们一起来了解下Java的注解吧。
什么是注解
注解(Annotation) 是从JDK5.0开始引入的新技术,他的作用是可以对程序作出解释,并且可以被其他的程序读取,例如可以被编译器读取。注解在代码中是以“@注释名”存在于代码中,也可以加一些参数值,例如:@SuppressWarnings(value=“unchecked”).注解可以用在代码中的 package(包), class(类), method(方法), field(成员变量) 上面,用于添加额外的辅助信息,Java程序可以通过反射机制编程实现对这些元数据的访问。
元注解
元注解就是负责注解其他注解的注解,听着有点拗口,其实就是用在我们定义的注解上面的注解,元注解的作用是提供对我们定义的注解类型进行说明,比如我们的注解在代码的那个阶段有效呀之类的。Java提供了4个标准的元注解类型,这些类型可以在java.lang.annotation
包中找到,他们分别是:@Target, @Retention, @Documented, @Inherited
这几个注解的解释和使用如下:
@Target: 用于描述注解的使用范围,即注解可以使用在什么地方
@Retention: 表示需要在什么级别下保存该注解信息,用于描述注解的生命周期
(SOURCE < CLASS < RUNTIME)
@Documented: 该注解将被包含在Javadoc中
@Inherited: 该注解可以被子类继承
使用示例:
import java.lang.annotation.*;
//可以在类上使用我们的注解
@MyAnnotation
public class Demo {
//也可以在方法上使用我们的注解
@MyAnnotation
public void func() {
}
}
//表示注解可以使用在哪些地方
@Target(value = {ElementType.METHOD, ElementType.TYPE})
//注解在什么阶段有效
//取值:RetentionPolicy.SOURCE < RetentionPolicy.CLASS < RetentionPolicy.RUNTIME
@Retention(value = RetentionPolicy.SOURCE)
//@Documented 表示注解将会生成在JAVA DOC中
@Documented
//@Inherited 子类可以继承父类的注解
@Inherited
@interface MyAnnotation {
}
自定义注解
其实在上面的MyAnnotation就是一个自定义注解,我们可以使用@interface 声明注解,我们声明的注解会自动继承java.lang.annotation.Annotation接口
@interface MyAnnotation {
}
说明:
声明自定义注解的格式:
public @interface 注解名称{定义的内容}定义的内容: 是一些方法,每个方法实际上就是配置参数,方法名称就是参数名称
返回值的类型就是参数的类型(只能是基本类型,Class,String,enum),可以通过default来声明默认值
如果只有一个参数成员,一般参数名为value,注解元素必须要有值,定义注解元素时,经常使用空字符串,0作为默认值
接下来通过一个例子来看下自定义注解:
import java.lang.annotation.*;
//可以在类上使用我们的注解
@MyAnnotation
public class Demo {
//也可以在方法上使用我们的注解,可以传入咱们配置的参数啦
@MyAnnotation(name = "张三",age = 30,id = 9527,books = {})
public void func() {
}
}
//表示注解可以使用在哪些地方
@Target(value = {ElementType.METHOD, ElementType.TYPE})
//注解在什么阶段有效
//取值:RetentionPolicy.SOURCE < RetentionPolicy.CLASS < RetentionPolicy.RUNTIME
@Retention(value = RetentionPolicy.RUNTIME)
@interface MyAnnotation {
String name() default "";
int age() default 0;
int id() default -1;
String[] books() default {"C语言入门到入土","金瓶梅"};
}
我们可以看到代码中定义自定义注解的时候有一个default关键字,这个关键字的意义就在于可以使用它为配置的参数设置默认值,这样的话我们使用注解时不传入值的时候就会使用注解的默认值,否则我们必须为注解赋值,否则无法使用注解,如下图所示:
总结
本文主要介绍了Java的注解技术,包括什么是注解,如何使用注解,各种注解的使用。我们在很多的框架中都能看到注解的使用,所以学好注解是很有必要的。有了注解技术的加持,我们会在阅读框架源码时更轻松。