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