00:00
好,那这个说完以后,下面呢,咱们写一个例子啊,通过这个例子呢,咱们讲一个问题,就是大的class的一个实例的获取,看三上面这个是二吧,哎,这个是三啊,那这个三呢,我们想描述的是也是需要大家掌握的,就是如何获取大德class斯的实例,哎,需要落地大家掌握的,这呢我们提到有,哎我们讲四种方法啊。那这呢,我们写到这儿。获取大的class的实例的方式,哎这呢我们就一个个来讲,首先第一种方式,方式一,咱们上面其实也写过了啊,这这类本身咱们来一个点class,诶它呢就对应着咱们说这个大class的一个实例了,这个呢我叫CLASS1这样啊,那这呢需要有个细节点稍微关注一下,就这个class的话呢,本身它其实也在泛型了啊。哎,它在泛行了,那这块呢,什么意思呢?就是我们这里边啊,你这个大的class,它不是对于类的一个通用描述嘛,哎,此时的话呢,咱们其实是个person,给它这个负的值啊,所以呢,它具体操作的话呢,其实都是person,所以呢,我们这其实你要加上泛型就写上person啊,哎,就这样了啊这呢是加上泛型的情况,那这个class这呢,就是我们获取到它的一个实例了啊,那简单我们可以做一个c out,你看它这个输出什么。
01:28
哎,你看输出的其实就是我们当前这个person类本身。那就是他啊,那你把这个发型呢,删掉,这个不影响我们输出的这个效果。行啊,没有问题的啊成那暂时呢,我就先不加这个发型了啊,那大家呢,就是回头呢用上发型,咱们前面都讲过怎么用啊,都没有问题啊,这个我不加的话呢,你知道你看在哪些位置受影响啊,你给它加上就可以了啊,就加上泛型呢,就避免后边你在操作的时候呢,非得进行强转了啊就这样点这是方式一,这个方式一的话呢,我们总结为叫调用运行时类的这个属性啊,这个属性呢,就是叫第2CLASS。
02:11
OK,这是方式一,方式二。哎,方式二的话呢,我们就哎通过这个呃,运行时类的对象。哎,通过这个对象呢,我们进行一个获取什么意思呢?比如说啊,我这写个P,我就new了个person。啊,不管呢,你是通过哪个构造器造的啊,总之我现在得到一个person类的对象,这个呢,我们称作叫运行实例了,通过它的这个对象,我们呢可以得到class的实例,就是P1,咱们有个方法叫get class。就是获取一下你这个对象到底是哪个类造的,这个方法呢,在哪里声明的知道吗?哎,是不是咱们讲object们的时候呢,稍微提过这个事儿啊,你想任何一个类的对象,任何一个类的对象是不是都知道你是哪个类造的,哎,那所以说这个方法呢,自然而然我们就把它生明在object当中了啊,哎,对象呢,调object,呃,调get class就知道呢,你是哪个类造的了,这呢就是它这个类本身,哎,我们又赋给了另外一个class,这是我们的这个第二种方式,哎,我们打印一下这个CLASS2看一下。
03:24
哎,这呢没问题啊,还是我们这个person类啊,这就相当于是这个通过运行实例的对象,呃,对象去呢,来调用调get class这样的一个方法,行journal是我们的这个方式二啊,然后接着呢方式三,方式三呢,我们是叫调用大的class它的一个静态方法,对这个静态方法呢,叫做for name方法,在这里边指明我们,诶这个class它的一个全路径来我们写一下啊,通过这个大的class,它有一个叫for name方法,写写上我们这个class的一个name,注意这时候你别写个person啊,因为咱们在同一个model下,可能有不同的包下都有person,那你得给我说清楚到底是哪个包下的person。
04:13
那这个person的话呢,我们得写全了,这个呢,就是com点艾特硅谷点下的Java下的这个person。哎,是这样的一个啊,这呢我们称作叫类的权利名,就是以包包含包名在内的啊,这个类的一个完整路径啊,就叫权利名了,哎,通过这样一种方式,我们也可以得到一个大的class的一个实例,这就叫CLASS3了,这样这块呢会报异常。就像咱们前面呢,你通过一个流呢去操作一个文件一样啊,他可能会担心这个文件本身不存在,这呢也会担心呢,你我找不到这样的一个路径下的一个类,诶抛了一个异常啊,这个很容易理解,那此时呢,我也得到一个class的实例。哎,此时呢,我再去,哎哟。
05:02
哎,输出一下咱们的这个CLASS3。那这样啊。行,哎,这个大家看到了,还是我们这个person本身,哎这这样的啊,那你也可以当然做一个调整啊,比如说呃,我这个CLASS3怎么着呢,我换一个啊,就不拿这个person来了,诶我class叫for name,你可以写谁呢?这个Java点浪包下的是不是有个string呢?诶这个呢,就相当于是你加载呢,是我们这个string这个类,那此时呢,我再去打印这个CLASS3。那这就成死论了啊,杨ID呢,就是不管是我们自己定义的类,还是我们API呢,提供的这个类,这个类本身都作为我们这个大的class的一个实例啊,其实我们说不光是这个类了啊,其实还有很丰富的结构都是可以作为大的class的实例的啊,这个咱们暂时呢,先不说这个事啊,一会呢扩展的时候再说,行这呢我们就得到了一个CLASS3,那现在的话呢,从形式上来看,我是不是有三个变量是吧,三个变相我们都分别去做了一个赋值,形式呢不一样,那我们现在要想个事儿,就这三个对象,我现在呢,用一个操作符呢去操作,就是叫等等。
06:16
这时候想判断的是。是什么?一是不是想判断地址值,言外之意,我们此时的这个CLASS1和CLASS2,包括呢,这个呢,CLASS1和CLASS3,它们到底是不是指向的是同一个对象,嗯,我们通过结论呢,看一下发现都是初五,言外之意我们这种方式,虽然这个方式不一样啊,但是咱们获取的是不是内存当中同一个运用室类啊,哎,同一运行实类,只是呢,我们获取的方式呢,有所区别而已啊,有所区别,那言外之义就是大的class实例对应着一个运行实类,而且我们这个运行实类一旦加载到内存以后,它呢,实际上会缓存一段时间。
07:08
啊,会缓存一段时间,我们下边呢,只是通过不同的方式呢,获取了内存当中的这个唯一的运行实例啊,他们呢,都是同一个啊在这呢,我们再明确的说一下,哎,第三个就是我们加载到哎内存中的这个运行时类啊会啊这个相当于存放在这个叫缓存区啊,或者叫直接说呢,会缓存一定的时间。啊,一定的这个时间啊,那么在此时间之内,哎,在此时间之内啊,然后我们可以,哎通过这个不同的这个方式啊来哎获取这个大的class这个实例,或者叫来获取这个此运行实例,哎,咱们下边呢,这不就讲了一下获取这个运行实例呢,有好几种方法,哎每个方法呢,我们又升这个赋给了这个大的class的这个变量了,大家注意这个问题啊,所以你看我下边这个位置,我没有写什么呀,我没有写叫如何创建大的class斯实例,哎,我写叫如何获取,就是我们加到内存中的时候呢,这个运营实例就放在这了。
08:22
以前呢,我们没有讲反射这个运输类呢,照样是需要加载的,只是我们没有强调这个事儿,那加载完以后,如果你要用到这个类本身了,那你可以给它,哎赋给一个变量,只不过这变量呢,我们叫class类型的CLASS1了。哎,让它呢,指向我们这个唯一存在的这个运行实类了,那那你也可以通过其他的方式,比如下边这个方式二方式三,那我又造了一个C2,造了一个C3,诶此时呢,咱们都是获取的唯一存在的这个运营室内。延的这个运用室类,我们不会在它的生命周期范围之内呢,再去加载重复的第二个,第三个,因为完全没有必要。
09:02
啊,完全没有必要,你要从这个角度来看,这个运势力本身也可以看成就像个单立的,只是呢,获取的方式稍有区别,哎,这是这样啊,行这呢我们写了三种方式,这三种方式哈,需要大家掌握,哎这个呢,前三种方式需要掌握,那我们在不同的这个掌握啊,诶咱们在这个不同的这个情况下呢,可能会用到不同的这个方式来获取这个大的class实例,诶这三个需要掌握,那我们再讲一个需要大家了解的,哎,这个方式四呢,我们提到一个叫使用叫类的加载器。啊,这个类的加载器类的加载器,加载器呢叫做class loader,哎叫class loader行,那我们看看怎么去写啊,嗯,这个代码呢,大家做一个了解,嗯,我们调这个当前这个方法的时候,嗯,或者我们先看看谁呢,当前咱们代码都写在当前这个类里了,这是咱们自定的一个测试类,嗯,我可以通过当前这个测试类点class,然后去get它的一个叫class loader。
10:09
诶这呢,就得到一个class loader,一会儿呢,咱们稍微展开说一下这个class loader,那class loader得到以后。哎,我们通过它呢,去显示的来漏的一个class显示的去加载某一个类,那此时呢,我们想加载的就是这个,哎,这个包下的我们的person类。哎,加载它,那加载完以后,哎,我们这块呢,仍然会返回一个class类型的class,这我写一个四。嗯,行,那这时候呢,我们也可以去打印一下这个CLASS4,诶打印它同时呢,咱们也可以去判断一下这个CLASS1跟我们这个CLASS4呢,你看看一样不一样,因为他们仨都一样了啊,这我只比较一个就可以了。行,首先打印的,你看也是person,其次的话也是一样的。
11:04
所以呢,我们这里其实讲了有四种方式,这四种方式呢,都可以去获取一个大的class实例啊,都是针对咱们这个person类的啊,只是呢方式有所区别而已,这种方式呢,大家做一个了解就行。不需要大家呢去掌握了,用的相对来讲少一些啊,那这三种具体情况不一样啊,那这三种里边呢,有没有哪一种说用的稍微多一些啊,哎,这呢,我是从这个使用频率上来讲的,这三种里边呢,第一种呢,第三种,哎第三种用的多啊,你想第二种为什么少呢?因为咱们通过反射以后能做的事儿呢,就是第一个事就是能够创建你对应的运营设计对象,那你现在都有对象了是吧。哎,那这呢,我们就是诶不爱用这种了,而这种的话呢,其实它这个编译的时候呢,就写死了,你看我们编译的时候呢,比如我这写个PERSON1了,那是不是就报错了,现在这个编译的时候呢,就给定死了,而我们这个呢,你看我要写成PERSON1是不会报错了,运行的时候是不是才知道你这个在不在。
12:07
我们真正去跑起来了,一运行发现挂了,哎还真找不到你这样路径下的一个类PON1,哎这个时候才爆的,也就是说呢,通过这种方式呢,其实更好的能够体现我们所说的动态性啊,因为反射呢,主要想体现就运行时候的一些动态性,编译的时候呢,先不去确定,哎它呢就更好的体现了这样的一个点。啊,这个呢又稍微的抽象,呃,大家先不用去深究啊,你先知道呢,呃,使从这个使用频率上来讲呢,这种呢,用的稍微多一些啊就可以了,行这呢是我们讲到如何获取这个大的class实例的几种方式,这个落地需要大家掌握啊,包括呢,刚才我们关于这个这个类的一个加载过程,以及呢,什么叫大的class的一个实例,哎,大家呢,也要熟悉一下。
我来说两句