天天看点

注解和反射学习

概念:顾名思义,与注释类似注释给人看,而注解可以给程序扫描读取信息

作用:

不是程序本身,可以对程序作出解析

可以被其他程序读取

自定义

组成

元注解

@Target 作用目标

@Retention 保留区域

@Document 文档保存

@Inherited 子类继承

@interface

字段

类型 + 字段名 如:String[] name()

若字段名为 value() 使用的时候可以默认不写

若追加default默认值 使用的时候不会要求必须填写字段值

概念

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键

原理

类在加载到JVM的过程中,会在JVM的方法区堆内存中存储类的信息,再在普通堆内存中生成类的class镜像作为方法区类的信息的访问入口

类加载到虚拟机的过程为:

加载 --> 连接 --> 初始化 --> 使用 --> 卸载

加载:虚拟机提供的各种加载器,默认先加载环境所需要的类文件,如ext中的

连接:

验证:检查代码符合虚拟机读取解析的规范

准备:内存准备 正式为类变量分配内存并设置默认值,该阶段在方法区堆内存进行

解析:虚拟机常量池的符号引用(常量名)替换为直接引用(地址)的过程

获取

全限类名获取

对象获取

Class类的静态方法 Class.forName()加载获取

内置基本类型 类名.Type获取

ClassLoader获取

性能方面

因为能获取所有类信息,功能强大,但性能能耗却很高

在获取私有信息时,使用accessible(true)方法开启访问,性能能耗会降低