文章目录
Java注解与反射
是框架的底层
注:给人看
解:给程序看
注解是有功能
1. 什么是注解
作用
- 不是程序本身
- 可以对程序做做出解释
- 可以被其他程序读取
格式
- @注释名
- 可以加一些参数值
2. 内置注解
- 重写
- 废除,不推荐使用
- 抑制警告
- 有参数
3. 元注解
- 用来注解其他注解的注解
- 有四个
4. 自定义注解
5. 反射概述
静态 动态语言
- 动态语言
- 在程序运行时可以改变程序某些内容
- 静态语言
反射机制
- 在程序执行期间,
- 取得类的内部信息
- 可以操作对象的方法/属性
- 在类加载完后,内存堆区会产生一个Class类型对象
- 通过这个对象能看到类的信息
- 通过Class来实现
6. 获得反射对象
反射的优点
- 灵活
缺点
- 通过反射相当于通过JVM
- 比正常执行多走了一步
- 慢
获得反射对象
- 在main线程中
- Class.forName(“包名”)
- 会返回一个Class对象
- 加载这个类
- 一个类在内存中只有个对象
- 对象.getClass 获取一个Class对象
7. 得到Class类的几种方式
- Class c =
- Class.forName(“包名”)
- 对象.getClass
- 类名.class
- 内置类.Type
8. 所有类型的Class对象
- class外部类
- 接口
- 数组
- 枚举
- 注解
- 基本数据类型
- void
9. 类加载内存分析
Java内存
- 堆
- new的对象和数组
- 可以被别的线程共享
- 栈
- 基本类型
- 引用类型
- 方法区
- 可以被所有的线程共享
- 包含了所有的class和static变量
类的加载过程
- 加载
- 把类的Class文件字节码读进内存
- 转化成很多运行时的数据结构
- 创建一个Class对象
- 由类加载器完成
- 链接
- 验证之前的操作没有问题
- 给static分配内存,并设初值
- 类初始化
- JVM负责
内存图,步骤顺序
- 方法区(也是堆,特殊的堆)
- 类的数据全部加载进来
- 堆
- 生成类对应的Class对象
- 生产其他new出来的的对象A
- 通过Class的数据,把A初始化
- 栈
- 把被操作的数据复合起来,视为一个总的操作
- 类构造器的一个方法
10. 分析类初始化
什么时候发生类的初始化
- 主动引用发生类的初始化
- new
- JVM启动,初始化main所在的类
- 调用类的静态成员、方法
- 初始化一个类时,它的父类
- 反射时
- 被动引用,不发生类的初始化
- 通过子类调用父类的静态变量
- 数组
- 常量
11. 类加载器
过程
- .java -> .class
- 类加载器 ->校验器,解释器,操作系统
类加载器作用
- class对象,在类加载时创建
- 类加载之后,有缓存,维持一定时间不用会被类加载器清掉
类加载器种类
- 引导 类加载器
- 用来加载核心类
- rt.jar
- 扩展 类加载器
- 加载另一个jar包
- ext文件夹下
- 系统 类加载器
- 项目里的jar包
java中的包
- jre目录下lib
- rt.jar
- ext文件夹下