一、注解
普通注解
1、@Override
2、@Deprecated
3、@SuppressWarnings
元注解
1、@Document
2、@Target
3、@Retention
4、@Inherited
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface metaTest {
public String doTest();
}
自定义注解
二、APT工作原理
注解处理器(Annotation Processor)是javac的一个工具,每一个处理器都继承于AbstractProcessor。
1、声明的注解的生命周期为CLASS
2、继承AbstractProcessor类
3、再调用AbstractProcessor的process方法
三、反射 + 运行时注解举例
反射的作用:
1、判断任意一个对象所属的类
2、构造任意一个类的对象
3、判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法)
4、调用任意一个对象的方法
反射的缺陷:
对JVM的性能有影响,因为JVM无法对反射的代码进行内存优化,同时反射会产生大量的临时对象,导致大量的GC,
从而造成内存抖动,可能会导致UI卡顿
举例:在idea中运行
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestInterface {
int value() default 100;
}
public class ReflectMain {
@TestInterface(12)
public int age;
public static void main(String[] args) {
ReflectMain main = new ReflectMain();
TestInterface testInterface = null;
try {
Class clazz = main.getClass();
Field field = clazz.getField("age");
testInterface = field.getAnnotation(TestInterface.class);
System.out.print(testInterface.value());
} catch (NoSuchFieldException e) {
System.out.print("no such field");
}
}
}
四、ButterKnife的工作原理
1、编译的时候扫描注解,并做相应的处理,生成java代码(调用javapoet库生成)。
2、调用ButterKnife.bind(this)方法的时候,将ID与对应的上下文绑定在一起。