注解
- 概念:顾名思义,与注释类似注释给人看,而注解可以给程序扫描读取信息
- 作用:
- 不是程序本身,可以对程序作出解析
- 可以被其他程序读取
- 自定义
- 组成
- 元注解
- @Target 作用目标
- @Retention 保留区域
- @Document 文档保存
- @Inherited 子类继承
- @interface
- 字段
- 类型 + 字段名 如:String[] name()
- 若字段名为 value() 使用的时候可以默认不写
- 若追加default默认值 使用的时候不会要求必须填写字段值
- 元注解
- 组成
反射
- 概念
- Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键
- 原理
- 类在加载到JVM的过程中,会在JVM的方法区堆内存中存储类的信息,再在普通堆内存中生成类的class镜像作为方法区类的信息的访问入口
- 类加载到虚拟机的过程为:
- 加载 --> 连接 --> 初始化 --> 使用 --> 卸载
- 加载:虚拟机提供的各种加载器,默认先加载环境所需要的类文件,如ext中的
- 连接:
- 验证:检查代码符合虚拟机读取解析的规范
- 准备:内存准备 正式为类变量分配内存并设置默认值,该阶段在方法区堆内存进行
- 解析:虚拟机常量池的符号引用(常量名)替换为直接引用(地址)的过程
- 获取
- 全限类名获取
- 对象获取
- Class类的静态方法 Class.forName()加载获取
- 内置基本类型 类名.Type获取
- ClassLoader获取
- 性能方面
- 因为能获取所有类信息,功能强大,但性能能耗却很高
- 在获取私有信息时,使用accessible(true)方法开启访问,性能能耗会降低