Skip to content

Latest commit

 

History

History
97 lines (65 loc) · 3.54 KB

2.注解.md

File metadata and controls

97 lines (65 loc) · 3.54 KB

课件: 1.注解的作用或者意义是什么? 注解本身没有任何意义,单独的注解就是一种注释,他需要结合其他如反射、插桩等技术才有意义。 Java注解(Annotation)又称Java标注,是JDK1.5引入的一种注释机制,是元数据的一种形式,提供有关于程序但不属于程序本身的数据。 注解对他们注解的代码的操作没有直接影响。

2.元注解:意思是注解上的注解。 Target元注解: 作用是限制注解使用的范围。 Retention元注解: 作用是限制注解作用的级别。 自定义元注解样例: @Target(ElementType.ANNOTATION_TYPE) public @interface YuanZhujie { }

  1.                              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