java注解的基础认识
java注解的分类:
@Target:用于目标元素的注解,@Target(ElementType.TYPE)其中ElementType枚举有:1.TYPE(主要作用于类与接口);
2.FIELD(属性与枚举常量);
3.METHOD(方法);
4.PARAMETER(方法中的参数);
5.CONSTRUCTOR(构造方法);
6.LOCAL_VARIABLE(本地变量);
7.ANNOTATION_TYPE(注解类型);
8.PACKAGE(包);
9.TYPE_PARAMETER();
10.TYPE_USE()。
@Retention:用于保留注解,@Rentention(RetentionPolicy.RUNTIME)其中RetentionPolicy枚举中有:
1.SOURCE(不被编译器保留);
2.CLASS(被编译器保留成class文件,不被VM保留,默认的方式);
3.RUNTIME(被编译器保留,也被VM保留,通过反射读取)。
@interface:用于定义注解:@interface 定义格式:
public @interface Print {
String author() default "";//默认不允许为null,可定义基本数据类型、引用数据类型、类、注解
String date() default "";
}
完整的常用注解定义形式:
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.CLASS)
public @interface Print {
String author()default "";
String date()default "";
}
@Inherited:指示自动继承注解类型,父类添加@Inherited注解,子类可以获取父类注解。
@Documented:用于注释的一种注解,可以使用javadoc -d javac -d编译生成注解文档。
android中常见的三种注解
1.@Override:方法重写的一种注解;
2.@SuppressWarnings: 在编译前忽略警告,无需编译时警告;
3.@Deprecated: 使用了废弃、过时的api一种注解。
这三种注解都是保留在SOURCE中,在开发程序时经常使用到,无需到编译时。
运行时、编译时处理(APT)
运行时处理:通常结合反射来处理,通过反射拿到的属性、方法、类都支持getAnnotation来获取注解,从而实现运行时修改其源码的效果。缺点:由于反射运行时保存文件和读取文件,所以造成性能效率有点低。
简单的一个ButterKnife的实现:
编译时处理:主要使用APT(Annotation Process Tool),通过扫描解析注解信息,最终通过process方法中输出java类。PS:使用Squre公司的javaPoet来辅助输出java类。 https://github.com/square/javapoet