注解(@interface)也是jdk1.5引入的。
注解作用
注解,作用其实就是做一个标记或者是标识。单独使用没有任何意义,所以注解一般都是配合使用。
常见的使用地方,比如dragger2,忽略警告的注解,继承父类的时候重写注解,butterknife里面的注解,过时注解。
经常和反射、动态代理配合使用,
应用场景
在源码级别,一般是用在APT技术上。这个技术就是说,在编译的时候,根据注解标记的类或者成员变量、方法等,动态生成一些工具类,来完成一些功能,比如目前流行的dagger2和greenDao3,都是采用的apt技术动态生成的类。在直白一点就是你写一个自定义注解,然后APT绑定你这个自定义注解,写了注解的,就生成一些其他的类来完成一些功能。
源码级别还有一个应用场景,就是做语法检查,比如一些非空检查或者必须是int类型的检查的元注解,和泛型的extends类似的感觉。
在字节码(class)阶段,一般是做字节码增强技术, 就是说,在java文件编译成字节码文件之后,修改这个字节码文件,来完成某些功能。也可以说是字节码插装技术吧。
在运行阶段,基本就是和反射配合使用,最开始的时候Butterknife就是这个方案,用过的都知道,需要在Activity里面绑定一下才能找控件,现在都换成APT技术了。
注解定义
如何自定义一个注解
//这两个放在注解上的是元注解
//Target是定义下面自定义注解的是放在类上还是属性上或者方法上等。下面列几个常用的
//TYPE是作用在类上
//FIELD是作用在属性上
//METHOD作用在方法上
//PARAMETER作用在参数上
//注意,这个Target可以写多个,也就是即使在类上用,又是在方法上用。
@Target(ElementType.TYPE,ElementType.METHOD)
//这个Retention是定义这个注解的生命周期,这个比较少一共就三个
// SOURCE,这个是源码阶段就结束了 使用javac指令,注解就没了
// CLASS,//这个是编译时存在,运行时不存在了,javac之后的字节码还在,但是运行的时候就不在了
// RUNTIME;//这个是运行时还存在。一直保留到运行时期。
@Retention(RetentionPolicy.SOURCE)
public @interface MyAnnotation {
String value() default "";
int id() default 0;
}
注解其实没什么太多内容,其实注解基本就是配合其他技术使用完成一些功能,基本都是为了解耦。