在开发中一些第三方框架经常会使用一些注解来实现功能,项目中也经常会使用到一些注解需要自己去自定义。
一般情况下自定义注解会与反射或者动态代理结合使用,这里先整理一下注解相关的东西。
自定义注解
首先先看下一个常规的自定义注解长什么样子:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Inject {
/**
* =没有default 就必须传参
* value 是默认的
* @return
*/
// String value() default "";
String value();
int id();
}
从上面的代码可以看出自定义注解非常的简单,只要创建一个@interface
的类加上一些注解就是自定义注解了。
而类的上面还有一些诸如@Target
、@Retention
的标签,是来指定这个注解的一些信息的,叫元注解。是注解的注解。
下面的整理一下元注解。
元注解
- @Target
- @Retention
- @Documented
- @Inherited
@Target
这个元注解的的作用是描述注解的使用范围,常用的有
public enum ElementType {
TYPE, // 类、接口、枚举类
FIELD, // 成员变量(包括:枚举常量)
METHOD, // 成员方法
PARAMETER, // 方法参数
CONSTRUCTOR, // 构造方法
LOCAL_VARIABLE, // 局部变量
ANNOTATION_TYPE, // 注解类
PACKAGE, // 可用于修饰:包
TYPE_PARAMETER, // 类型参数,JDK 1.8 新增
TYPE_USE // 使用类型的任何地方,JDK 1.8 新增
}
@Retention
这个元注解的作用是描述注解的保留级别,即注解可以被保留到何时。
public enum RetentionPolicy {
SOURCE, // 源码阶段 应用场景:APT(注解处理器),帮助生成额外的辅助类
CLASS, // 字节码阶段 应用场景:字节码增强
RUNTIME; // 运行阶段(包含SOURCE和CLASS) 应用场景:反射
}
@Documented
它的作用是在使用 javadoc
工具为类生成帮助文档时是否要保留其注解信息。
@Inherited
它的作用是被它修饰的注解具有继承性,当有父类有这个注解时,子类默认实现这个注解。
自定义注解使用
自定义注解结合上面的元注解就可以简单的使用了,例如:
@Inject(value = "name", id = 2)
public class MainActivity extends AppCompatActivity {}
当然怎样拿到注解里面的参数信息,以及怎样给参数赋值等,需要结合反射来进行。