注解
元注解:注解其他注解
- @Target:描述注解适用范围
- @Retention:需要什么级别保存该注解信息,用于描述注解生命周期(SOURCE < CLASS < RUNTIME )
- @Document:说明该注解被包含在Javadoc中
- @Inherited:说明子类可以继承父类的该注解
自定义注解
- @interface
- 声明一个配置参数
- 用default声明参数默认值
- 如果只有一个参数成员,参数名为value
- 注解元素必须要有值
反射
获得反射对象
Class c = Class.getName("...");
System.out.println(a);
Class类
- Class本身是一个类
- 一个加载的类在JVM中只会有一个Class实例
- 一个Class对象对应的是一个加载到JVM中的一个class文件
- Class类是Reflection根源,针对任何你想动态加载、运行的类,需要先获得相应的Class对象
Java内存分析
- 堆: 存放new的对象和数组,可以被所有线程共享,不会存放别的对象引用
- 栈:存放基本变量类型,引用对象的变量
- 方法区:可以被所有线程共享,包含所有的class和static变量
类加载的过程:类的加载 -> 类的链接 -> 类的初始化
- 类的加载:将class文件字节码内容加载到内存中,将这些静态数据转换成方法区的运行时数据结构,生成代表这个类的java.lang.Class对象
- 类的链接:将java类的二进制代码合并到JVM运行状态中
- 类的初始化:
- 执行构造器
()方法,将所有类变量赋值动作和静态代码块中的语句合并 - 当初始化一个类的时候,发现其父类还没有初始化,先触发其父类初始化
类初始化
-
类的主动引用一定发生类的初始化
main、new一个对象、调用静态成员和静态方法、使用reflect、初始化一个类初始化其父类 -
类的被动引用不会发生初始化
子类访问父类静态变量、数组定义类引用、引用常量
类加载器
源程序(.java) -> java编译器 -> 字节码文件(.class) -> 类装载器 -> 字节码校验器 -> 解释器
- 引导类加载器: Java核心库(rt.jar)
- 扩展类加载器
- 系统类加载器