00:00
那么接下来呢,我来给大家演示一下这个第二方式。各位。第二种啊。Java中任何一个对象都有什么呀?都有一个方法,叫做get class。我们来看一下各位啊,在JDK的帮助文档中,老祖宗我们很早很早以前就接触过他了,对不对?Object打开object之后呢,往下找,大家看这里。Object这个类当中啊,有什么呀?有一个方法叫get class,你看了吗?老祖先自带基因,这个方法就可以获取一个class。看见了吗?所以这块呢,Java中任何一个对象都有一个方法叫get class。那么这个get class呢?我们怎么去获取呢?比如现在有个字符串S,这个字符串它是个对象啊。对吧,ABC,然后这个字符串它既然是个对象S,它就有一个方法叫get class,就拿到了一个class。
01:05
X。那么这个X和谁呢?X代表是谁的字节码呀,因为你是字符串去调get class,所以你现在这个X就代表准。代表什么呀?string.class字解码文件X代表什么呀?哎,不是XX啊,代表什呀,String类型。那么。我们现在这个class c和我们这个class X,它的内存地址一样,不一样。我们来看C啊,等于等于什么呀X。因为你C不是代表也是string点文件吗?我的X现在也代表的是string.class文件,所以呢,我这个这个内存地址一样不一样,这个C报错了,我给它放外边吧,行吧,放外边啊。
02:03
放外面C。啊,这个C还不能直接用,各位这样呢,给个空。给个值啊。好了,那么这块呢,我们来执行一下。这个结果是true,各位双等号判断的是什么?判断的是对象的什么内存地址吧?如果结果为true的话,表示C里边保存的地址和X里边保存内存地址是一样的,对吧?那雨桐老师这个为什么会一样呢?它的内存结构图是怎样的呢?它是这样的,各位啊,我们顺便画一下这个图。来我们叫做二三十四啊,我们叫做。嗯。
03:01
自解码啊,内存图吧,这么着吧,啊,起个这样的名字,整个这个东西呢,我们可以认为是一个Java虚拟机JVM。然后呢,JVM当中有什么呀,有方法区。有堆对吧,有站吧。是不是,哎,这些呢,自始至终我们都是这么过来的。啊,都是这么过来的,来这边呢,我们画上啊,这是一个站,这是一个堆。这是一个什么呀,叫做方法。去。首先呢,这个程序啊,会执行这个焖方法,那焖方法执行会压站,所以这边呢,一定是把它压过来了。对吧,这是一个闷方法,战争啊。方法战争,那么接下来呢,它这个程序啊,就是class c。是Java。这个会导致类加载,各位会把这个类装载进来。
04:00
装载的方法,区里边C里边保存内存地址指向这个对象。它会在这加载一个什么呀,加载一个string的字节码。文件明白吧,string.class。文件。那么这个时候这个文件在方法区里边,它占用一定空间,它肯定有内存地址。Class c等于什么呀?0X123124吧,随便写吧,然后它呢,其实是直接指向了什么呀,这个字解码。明白吧,啊,那下面我就不再画了,各位啊,这个就不再画了,往下直接走了,String s等于ABC。这个ABC啊,实际上是什么呀,是一个字符串对象。明白吗?字符串对象。那么这个S我这个就不画了,各位啊,这就不画了,S调get class这个方法就可以拿到什么呀,我们重点class。那么这个class X呢?在这儿实际上指向的是同一个。
05:03
也是什么呀,0X124。这个X指向的也是这个类型。就是实际上自建面文件在内存当中只有一份。就自解码文件在内存中啊,就是自解码文件装载到。JVM中的时候只装载一份。只装载一份啊,你的C代表的是这个class文件,你X代表还是这个class文件。注意啊,这个X得到的是通过S调get class来得的。这是第二种方式,通过就是Java中任何一个对象它都有这个方法叫get class这个方法就是帮助大家有啊get class这个方法。拿到一个。明白吧,哎,这是我们组的第二种方式,你包括这边也是一样,你说你date啊time,你有一个date。
06:00
是吧,那你这个date对象你就拗出来了,扭出来之后呢,接下来你time这个对象叫get class这个方法,那么你是不是就会返回一个class y啊。那么现在呢?大家想一想我们的CR。我们的C2和我们Y是不是一样的呢?因为你这个CR代表的是这个YouTube下面的date这个class文件,那我现在是new了一个date出来了,New完之后呢,通过这个time呢,去调的该class拿到这个Y,那你说这个C2和Y是不是都指向同一个字节码文件呢?都是这个自检码文件的,来我们执行一下。好,大家看这个结果是不是也是处啊?对吧,哎,因为C2和Y2个变量中保存的内存地址。都是一样的,都指向方法区中的字解码文件啊,你可以这样去理解C2和Y。
07:10
啊,C2和Y。啊,它指向string,那将来在这儿呢,它会有一个date呀。对吧,它会进行类加载,加载进来一个什么呀,java.u.class。文件。是不是他会把这个加载进来。加载进来之后呢,你这块呢,可能会有什么呀,有我们刚才所说的C2。和Y。C2。等于0X11。他呢,去指向谁呀,他呗。是不是,那你这块呢,还有一个叫Y的。因为你是通过time这个对象来获取的,所以你这个time它是个date,所以这个Y呢就代表这种类型。啊来。
08:00
这个Y呢,里边保存的也是0X11,你就随便随便画了啊来。找一个。也是指向他的。是这样的啊,它指向方法区域当中的自解码。就这class这种类型比较特殊。啊,我现在只讲了两种方式,各位啊,第一种方式是。Class。For完整类名包名是吧,好第二种呢。第二种是返回class叫什么呀?叫引用点get什么class方法。通过引用点get class,或者你直接写对象,通过对象点get class。啊,第三种的话,我们到下午再说吧,大家吃饭去吧啊。
我来说两句