课件: 1.注解的作用或者意义是什么? 注解本身没有任何意义,单独的注解就是一种注释,他需要结合其他如反射、插桩等技术才有意义。 Java注解(Annotation)又称Java标注,是JDK1.5引入的一种注释机制,是元数据的一种形式,提供有关于程序但不属于程序本身的数据。 注解对他们注解的代码的操作没有直接影响。
2.元注解:意思是注解上的注解。 Target元注解: 作用是限制注解使用的范围。 Retention元注解: 作用是限制注解作用的级别。 自定义元注解样例: @Target(ElementType.ANNOTATION_TYPE) public @interface YuanZhujie { }
-
Deprecated 表示此方法已废弃、暂时可用,但以后此类或方法都不会再更新、后期可能会删除,建议后来人不要调用此方法。 Documented
ElementType -- Inherited 类继承关系中,子类会继承父类使用的注解中被@Inherited修饰的注解
Annotation Override
RetentionPolicy -- Retention
Target
样例: @Target(ElementType.TYPE) @Retention(RetentionPolicy.SOURCE) public @interface Jian{ String value(); }
笔记: 1.RetentionPolicy分类: SOURCE、CLASS、RUNTIME SOURCE:注解保留在源码级别中,并被编译器忽略。 CLASS:注解在编译时由编译器保留,但Java虚拟机(JVM)会忽略。 RUNTIME:注解由JVM保留,因此运行时环境可以使用它。 案例: 级别 技术 说明 源码 APT/IDE语法检查 在编译期能够获取注解与注解声明的类包括类中所有成员信息,一般用于生成额外的辅助类。 字节码 字节码增强 在编译出class后,通过修改class数据以实现修改代码逻辑目的。对于是否需要修改的区分或者修改为不同逻辑的判断可以使用注解。 运行时 反射 在程序运行期间,通过反射技术动态获取注解与其元素,从而完成不同的逻辑判定。
.java -> javac -> .class
javac调用:采集所有的注解信息 -> Element -> 注解处理程序
2.ElementType分类:TYPE、FIELD、METHOD、PARAMETER、CONSTRUCTOR、LOCAL_VARIABLE、ANNOTATION_TYPE、PACKAGE、TYPE_PARAMETER、TYPE_USE
3.注解:语法检查功能(IDE实现)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.SOURCE)
@IntDef({MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY})
@interface WeekDays {
}
public static void setCurrentDay(@WeekDays int day) {
}
@WeekDays
private static final int setCurrentDay = 0;
4.一个对象占用的内存大小? 12字节对象头信息 + 对象信息 & 8字节对齐。
5.javac编译源文件 -> 生成.class文件 javac -classpath .../libs/compiler.jar .../TestAnnotation.java .../Jian.java
6.字节码增强技术 在字节码中写代码 .class -> 格式 数据按照特定的方式记录与排列 .class -> 通过io -> byte[] -> 根据规则修改
7.字节码插桩技术 根据注解信息操作字节码内容。 注解级别在class级别 javap 反编译
总结:
面试题:
AROUTER BUTTEKNIFE 注解级别为源码级别 SOURCE 热修复、aspectj框架 注解级别为字节码级别 CLASS Retrfit 注解级别为运行时级别 RUNTIME