探讨java的反射机制

今天我们来探讨一下java的反射机制,在了解java反射机制前,我们需要对java的编译是如何进行的做一个了解。

1、java是如何编译的

我们先来介绍java的编译,我们都知道我们在写完java代码时,运行这个java前,我们的java代码会进行编译,也就是将我们的java代码编译成一个.class的字节码文件,那么这个就是我们编译生成的二进制文件,这个字节码文件主要是交给类的加载器去进行处理的,那么这类加载器就会将字节码文件加载成我们真正的在java中的一个类对象Class,这个类对象就是一个类,它的父类就是Object,它只是一个普通的类,但是它的内部就有我们的成员变量、方法、构造器等等,但是在这里的成员变量、方法是一个类,在完成这些操作后,就完成了编译和类的加载,最后就是创建对象,这就是一个完整的java文件运行的过程。

2、如何实现反射

那么肯定会有很多小伙伴问,这跟反射机制有什么关系,我们知道,java的反射机制是一个动态加载的过程,而上面的过程是一个静态加载的过程,反射机制主要就是通过类的路径获得该类的一个类对象.Class(任何的类都有且只有一个类对象,因为类只加载一次),如果我们通过new的方式,就像上面一样,不能获得这个类的Class对象,你获得的是一个你创建的对象,不是Class对象,当然我们也有方法获得Class对象,可以通过.Class() getClass()方式获取,但是这是你先new出对象后再执行的,那么如何不new而且获取类对象呢,可以使用Class.forName(类全路径)获取Class对象,获取了这个Class对象后,我们可以实例一个对象,然后使用方法等等

3、反射机制的说明

       这里肯定还是有很多小伙伴不太了解,下面的图可以帮助理解

 关于反射机制Reflect的API我们在这里不多讲,但是需要提一下通过反射机制获取类对象的方法,我们已经讲到通过Class.forName可以得到该对象的.Class对象,那么就可以通过方法,实例化出一个对象,这是一种,还有.class getClass ,我们还可以通过构造器获取对象,还可以使用类加载器完成

4、动态加载和静态加载

静态加载:就是我们第一个提到的,动态加载:就是通过forName获得到的,那么这两者有什么区别吗?静态加载,就是我们编写代码,然后经过运行所形成类对象,在我们写的这些代码中,不管这些类有没有使用到,都必须经过编译,然后形成字节码文件,然后生成类对象,即使这些代码没有使用到,但是动态加载,在运行时加载需要的类,就例如使用forName,如果运行时不使用此类,即使它不存在,也不会报错

5、类加载的三个阶段

类加载主要分成三个阶段,加载、连接、初始化,在连接这个阶段里又分有三个阶段,验证、准备、解析。我们写来介绍

加载阶段:加载阶段就是将代码编译成字节码文件,并创建一个类对象,这个过程又类加载器完成。

连接阶段的验证阶段:该阶段主要完成对我们加载阶段形成的字节码文件进行校验,看看信息是否符合虚拟机的需求,验证文件的格式。

连接阶段的准备阶段:该阶段是完成对静态变量分配内存和默认初始化,注意,这里是默认初始化,不是初始化,默认初始化是指0、null、false等,不是你写的值。

连接阶段的解析阶段:该阶段主要完成将符号引用转化为直接引用

初始化阶段:该阶段才是真正执行我们写的代码,但是依然是指的静态变量,编译器会将静态变量赋值和静态代码块按顺序进行合并,就是将它们放在一起(要按顺序),这里值得一提的是,这个阶段虚拟机会加上一个对象锁,保证只有一个类加载的过程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值