00:00
那下面呢,我们就具体来展开看一下类的加载过程的这样的几个阶段,首先呢,我们来看一下这个阶段一称为呢叫loading阶段,诶也叫做加载阶段,这块呢,大家先呃区分这样一个概念,我们这里边提的类的加载过程是一个宏观上的概念,然后它分成三个环节,三个环节第一个环节呢,恰好也称为叫加载了,哎,这个加载呢,是狭义上的,这个是广义上的,这个大家先区分清楚啊,别把这俩呃整混了啊,这是整体加载过程的三个环节中的第一个环节啊,恰好也叫做加载而已,行,那我们首先来看一下这个加载啊加载这块呢,有这样的三个说明,第一个呢,就是通过一个类的全限定名啊,就是全类名获取此类的二进制的字节流啊,就非常清楚啊,就是获取这个流文件,呃,流数据,因为呢,我们说这是一个可能是一个物理磁盘上的文件啊,咱们先以物理磁盘为例,呃,我们需要把它加载到内存当中,所以以流的方式来。
01:00
见。将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构,呃,这个类呢,本身我们要把它存放在方法区当中,这个方法区呢,是一个嗯,虚的一个概念啊,然后具体落地的话呢,那就看JDK版本了,那JDK7及以前啊,我们提到叫永久带啊,那么之后呢,我们叫原数据呃,原空间啊,那这个都算是方法区的一个具体的落地实现了,那我们现在呢,就泛泛成为方法区没问题,然后呢,在内存中生成一个代表这个类的啊对象,这个类呢就是大的class的对象啊,大家只要是学过反射啊,用过反射的应该都很清楚这个大的class了。呃,那么大的class的一个实例呢,就对应着我们当前加载到内存中这个二进制流,对应的这个类本身啊,作为方法区这个类的各种数据的一个访问入口啊,是这样的,那Java中我们说是,呃,万事万物接对象嘛,通过对象来访问具体的一些功能。
02:02
那这儿呢,我们加载到内存中的类就充当了大的class的对象,以它呢来作为一个访问入口,好,那这儿呢,我们这个加载到内存中,这个涉及到的这个自解码文件呢,都可以来源于哪儿呢?这呢举了一些例子啊,那比较典型的就是我们本地呢,就是这个这个运营程序的话呢,那都是从本地系统当中,呃,进行直接加载的,那这个比较简单哈,然后呢,我们还可以通过网络来进行获取,典型典型的就是web应用的这样一个场景啊,通过网络中来获取,然后还可以从这个压缩包当中诶去读取,那日后呢,像我们说这个Java文件啊,We we格式的文件啊,诶都是这个意思,都是一种压缩的格式啊,从这个当中去读取咱们的卡拉文件啊,大家呢,加载的一些第三方的一些炸包搭,当它当中呢,其实都是这个自解码文件啊。呃,运行时呢,计算生成那最多使用的叫诶动态代理的技术,那这呢,我们会用到这个浪包下,呃一个reflect子包下的一个pro这样一个类啊实现这个动态代理的技技术,呃,使用它呢来去动态的来加载啊,大家写过反射动态代理的话呢,这块应该也不陌生啊,然后由其他文件生成典型的场景呢,就是JSP应用啊,由JSP文件呢去生成对应的大的class这个文件啊。
03:22
还可以呢,从专有的这个数据库当中去提取这个大的class文件比较少见,然后还可以从加密文件当中来获取,呃加密嘛,就是我们本身呢,有一个比如说物理磁盘上一个class文件,但是我把它加密了,呃主要目的呢,是为了防止这个反编译是吧?呃,进行了一些保护措施啊,这个比如说咱们说这个安卓这个程序哈,如果你把它,呃这个生成的这个APK文件,咱们在前边呢也说过啊,把它呢改一个名,改成这个zip文件了啊,改成zip文件以后的话呢,里边呢,就有对应的这个class文件,呃,就是咱叫dex格式文件啊,但其实呢,它也相当于是最解码文件的一个变形了,那我们要想对它进行一个反编译的话呢,就会出来它的源码了,那你这儿呢,就很轻松的可以去盗版一个呃应用了,那它都会通常进行一些加密的措施啊,防止你反编译啊,那如果我们真正运行的时候啊,它真正运行加密的这个,呃,自己码文件的话呢,它还需要做一个解密的操作啊,这个是自然而然的这个。
04:22
事情啊,这呢就是我们说的第一个环节啊,这个里边需要大家特别注意的就是生成大的class实例呢,是在这个环节中出现的啊,这就可以了。
我来说两句