00:00
然后下边呢,我们再来看这个第三个点,那刚才呢,咱们提到了一下,就是关于我们这个方法区和堆中两个结构的问题,那下边呢,我们再具体说一下,那我们生成的这个类模板,它存储在哪呢?说加载的类啊,在Java虚拟当中会创建创建相应这个类结构啊,我们就要类模板了,它呢会存储在我们叫方法区,方法区呢是咱们说的这个GM官方规范的一个概念,那具体落地的话呢,以咱们hot power虚拟机为例。我们说在JDK1.8之前。咱们用的呢叫永久带,那这是1.8及之后呢,咱们称为呢叫圆空间啊,因为圆空间呢,替代了这个永久带,永久带作为咱们方法区的一个具体的实现的结构,对吧。啊,这块大家主要记住呢,就是嗯,这个存放在我们的源空间当中啊,这个知道它,那源空间的话呢,我们所使用的是不是本地内存啊,相应的这个空间呢,就会更大一些,对吧。好,那下边呢,就提到了我们说这个大的class实例的一个位置,你看大家看这块儿,比如说呢,我现在内存中,呃,这个咱们本来有一个资金码文件,叫做order是吧,然后呢,这个order的自解码文件呢,经过类的加载器,我们把这个类呢整个呢是存放在这个方法区当中,我们称为呢叫类模板对象。
01:13
接下来的话呢,我们会在这个堆空间当中啊,会生成一个大的class的一个对象,就是我们说的这个大的class的这个实例的位置。那那加到员空间中之后呢,我们在最终会创建一个大的class的一个对象,用来封装位于方法区中的这个数据结构,那这个大的class对象呢,它是指向你这个,嗯,方法驱动的这个整体类模板对象的。啊,这里边这个细节呢,我就不带大家展开去说了,呃,准确的话呢,其实在这个过程当中,我们要展开说的话呢,还是会比较复杂的,我们还会生成对应的一个大的这个,这个叫class这样的一个实例,它的一个这个mirror。啊,就是它的一个镜像呢,那是我们这里边儿这个大的class的一个实例。那这个具体的细节呢,我就不展开大家来带大家来说了,那这个呢,最终的效果呢,就是我们堆空间中创建了一个大的class的一个实例,它呢就指向了方法区当中,你这个类模板实例就是我们整个这个类可以这样来说。
02:12
嗯,就可以了,那下边呢,又关于一个描述,就是大的class这个类,这也是Java中的一个类,咱们说反射的一个源头,这个类呢,它的构造器是私有的,只有Java虚拟机呢才可以去创建。哎,这个大家注意一下它啊,那创建完以后呢,这个对象呢,内部它就指向了你这个那相关的那个,呃,加载到内存中的那个类的整体结构。它呢是咱们访问类型原数据的一个接口,也是我们反射的一个关键部分,对吧,那这呢,我们举了一个简单的一个反射的例子,这个例子呢,大家其实也都会写,我这呢就只是把它拿过来而已,来说明一下我们在通过这样的方式呢,对这个string的类进行了一个加载。对这个string类呢,进行加载了,加载到内存中之后呢,它就会在这个方法区生成一个大的string的这样的一个类模板对象,那我们这时候叫对象,其实就是你整个这个类本身啊,然后这个class呢,是我们方法区生成的这样一个,呃,这个堆空间生成的一个具体的实例,然后这个占空间呢,我们这个存放叫class,它指向了。
03:14
这里说的是这样。这是站。这对着方法区对吧,在这个站里边,这不局部嘛,我们这叫class指向了堆里边,你用的这个class的这个实例,然后这个实例里边呢,我们是指向了你方法区的这个大的这个string的一个。模板对吧?啊或者叫类结构啊,是这样一个情情况,然后接下来的话呢,我们通过反射,你看我这个做的什么事呢,是不是获取当前咱们把这个string呢,称为叫运行时类,当前运行时类的是不是,嗯声明的。因是类声明的这个所有方法呀。叫get declared methods就不管呢,你是什么权限修饰的,我们都可以获取到,下边呢,我们通过一个for循环,那下边呢,你看我们做的事是什么,这个的话呢,咱们叫Mo fair呢叫toth string,获取咱们当前每一个方法的一个叫修饰符。
04:08
这个修饰符对吧,那获取修饰符呢,它得到是一个数值,然后呢,我们这时候把它转换成对应的一个字符串啊,下边这个匹配的一个环节,然后再往下,这呢是咱们获取。获取这个方法的返回值类型,哎,没问题,把类型拿到,然后呢,下边是获取方法名。这个呢,咱们做反射,大家如果你写过这反射的话啊,应该都清楚,那我们反射呢,在框架当中是大量的被使用的,对吧?获取这个方法名,然后在下边儿呢,获取我们这个参数列表。方法的。参数列表,那我们说一个方法呢,它的参数呢,可能有多个,所以这呢,咱们得到的是一个数组,那你要也有可能没有吗?没有的话呢,直接就呃这个右括号呢封住,那如果要有的话呢,这个下边呢就变利啊取出每一个这个参数的类型。
05:01
啊,或者获取每一个参数的类型,在这写一下。类型好这就可以了啊,最后呢,一个结束,那我们这有个换行,然后呢,因为是个循环嘛,一个方法呢,占一行,那我们把这个程序再跑一下。好,那这里边我们看到了通过这个反射呢,这块对吧,我们没有去创建这个string的具体的实例,咱们这块呢,只要是你把这个类呢,加载到内存中了,我们就能够通过反射呢,指向了你对空间中,哎方法其中你整个这个类的模板,然后我们就通过反射呢,可以获取到它内部的呃剩余的所有的方法,那相应的这个数呃角字段呢,也是可以获取到的,只不过呢,我们这里边拿到的是这个方法而已。好,这个大家呢,去理解一下,咱们刚才说到的这样的一个结构。的这个结构,好,然后这块呢,我们再补充一个内容,就是关于叫数组类的一个加载。数组类对吧,我们在这个程序当中,实际上是不是可以创建,比如说像int型的这个数组。
06:02
对吧,哎,包括这个string类型的这个数组,像object类型的数组,那这都是,那么这个数组,你像这个string in类型数组跟string类型数组显然是不同的类型了,那我们怎么去看待这个相关这个数组类型的一个加载呢?这里边我们说稍微有点特别,因为呢,数组类本身并不是由类加载器来进行负责创建的。这个大家注意怎么讲呢,这个障碍虚拟呢,在运行的时候呢,根据需要我们去直接创建,根据需要我在运行的时候呢,我们去动态的去创建就可以了,那这时候呢,我们还要关注的就是这个数组的这个元素的类型,如果说我们这个数组的元素。你看下边呢,就具体说这个创建这个过程,如果数组的元素呢是int类型,那我们在一开始的呢,也讲到这个int类型。在这儿提到的是不是呢,我们不需要呢,直接来进行一个加载,是我们虚拟预先定义好的对吧,那预先定义好的,那我们只需要呢,关注于它的这个数组的长度其实就可以了。
07:00
哎,主要关注于我们这个数组这个长度就可以了啊,那针对于这种引用数据类型呢,那我们这里边呢,如果是用数据类型,就要遵循引用数据类型呢,那我们就要加载你对应的这个类型,比如像string类型,我们这一类型,这两个类型呢,我们需要呢进行一个加载。来进行一个加载,然后呢,大虚拟机会根据你指定的这个元素的类型和维度数组的维度,我们去动态的创建新的这个数组类,你要是基本数据类型呢,咱们就只需要关注这个维度就行啊,我们在对空间中,比如创建长度是十的,那这块呢,就这个四个字节,四个字节,四个字节一共呢是十个呗,就可以了。注意一下这个问题,那引用数据类型呢,我们主要呢是呃,加载你这个引用数据类型这个元素的这个类型,嗯,这呢大家要小心一点。行,下边又提到说,如果数组的元素类型是营类型的,数组类的这个访问性呢,就由这个元素类型来决定,比如说string的,你看string这个类型让不让你访问,哎,这个元素呢,我们拿到AR里边具体的元素了,这个关于string里边方法哪些能调不能调,那个你就看string的定义就行,那如果说我们是基本数据类型,那我们把这个int呢,就看成是一个public就可以。
08:11
这是我们说的关于这个问题啊,整个呢,关于这个加载呢,咱们就介绍到这儿,相对来说是比较简单的。
我来说两句