00:00
那么这块问题来了,就是说同学们就是经常说的老师这个灵活,你刚才说灵活灵活灵活在什么地方啊。用了多肽吗?那这种方式用了多肽吗?嗯。跟多肽没关系啊。你这儿可以加饭型了啊。你可以加泛型。明白吧?这样的话,你c.new instance出来就是什么呀,就是一个优点,你看了吗。有啊。没有用,没有用,泛型啊,跟泛型没什么关系啊,行,这我先暂时不说了啊呃,拐弯了啊拐弯了,你这一问呢,就拐弯了,行我先我先我先不说这个,不说不说这个事儿啊,就刚才说到哪儿,说到这个,这个灵活性嘛,是不是注意听啊,就是灵活。反射机制更加灵活。灵活在哪里呢?对吧?哎,这里有一个疑问是不是,那接下来我给大家演示一下反射机制的灵活性,好吧,大家看啊。
01:06
在这呢,我们去新建一个class,我们叫,然后TEST03,那么在这个测试程序当中呢,我是这样去写代码啊,我验证过反射机制的灵活性啊,验证反射机制的灵活性。那么这块呢,我们这样去做,各位大家看好了啊。我们啊,在这里准备一个文件。在这个。25下边啊。新建一个file,这个文件呢,我们就叫class.properties。大家看清楚了,这个文件我们之前讲过叫属性配置文件,对不对?那属性配置文件吗?Class ino.properties那么这个时候我前面写个class name这个名字呢,我拿过来,我写谁呢?来走走走走走走走来把它打开,打开这个user之后呢,我把user这个类名啊,我copy一下,我放哪了,我放到这个位置上,好大家看,在这个属性的配置文件里面,我配了一个class name等于它。
02:06
那么这个时候我能不能通过能不能通过IO流去读取到这个类的名字呢?来,我们一起读一下各位啊。通过什么呀?通过IO流读取什么呢?读取这个class ino.properties文件。我们读这个文件区各位啊,怎么读还记得吗?首先创建个理由叫file reader,是不是,哎,Reader你有一个什么呀?哎,叫file reader吧,注意听课啊,注意听课,来这个fire reader呢,读的是哪个文件呀?叫TYPE25章节下有个文件叫class info.properties好,就读这个文件,那么这叫属性配置文件来接下来这个异常我就先不用管了啊,先给它抛出了,好,那么接下来创建什么呀?创建属性类对象map是不是怎么创建properties pro,你有一个properties。
03:00
是不是哎六出来这个map集合就有了,那有了这个map集合之后呢,加载就行了,对不对?加载怎么加载漏的这个方法,把上面这个流作为参数传进去这个文件里边东西是不是就加在这个map集合里边了。好了,那么接下来我们是不是可以通过key获取value啊?对吧,那这个流可以关闭啊,关闭流,关闭流吧,哎,咱们认真点啊,关闭一下这个流就关闭了,因为你你已经通过这个流把这个文件里边数据加载到了我们的这个map集合里边,所以这个流就可以关了,那现在程序到这儿,说白了你个集合里边就有数据了,有k value k value啊,还记不记得k value都是string呢,还记得吧,哎,这是一个properties。那这个属性类对象呢,它可以调get property这个方法,这是之前大家的功底了,你还记不记得这个方法叫get property,可以通过K这个等号左边是不是一个K呀。哎,你把K拿过来放在这个位置上,那这样的话我们就可以返回一个,哎,Y6。
04:00
那现在我们把这个类名就拿到了,各位啊,拿拿到了,那我们执行一下大家看。我们现在是不是可以通过读这个配置文件拿到这个类名,你看我去读这个配置文件啊,我是不是就拿到了这个配置文件里面配的这个类名啊,这是这个类名啊,你看拿到了吗?那拿到类名之后,我刚刚讲过,我们通过反射机制能不能创建对象啊,通过反射机制实例化对象,那么怎么实例化对象呢?大家看应该是class for name,这个地方还记不记得跟一个完整类名。那么这个完整类名呢,它是一个字符串是不是,哎,那么正好它是不是就是一个完整类名。通过配置文件这个K得到这个后面那个,它是不是一个类名。那如果把这个类名拿到这里,返回的class,回的是不是就是个class啊?那返回class之后,这个C能不能new创建对象呢?好,大家看对象就有了,我们把这对象输出。
05:01
对吧,大家看这个程序啊,直接执行,大家看能不能创建出这个user对象。我们现在创建是UR对象,对吧?大家听我说啊,到关键时刻了,各位注意听,此时此刻我Java代码不做任何改动,我一行代码也不改,我改配置文件,我把配置文件里边这个类名改成java.date大家看清楚了,我再去执行这个程序,听听听听清楚了啊,我这个代码可没改啊,我再去执行这个程序,大家看这个,这次运行代码创建的对象是不是就变了,变成一个日期对象。为什么呀?因为你的这个位置的类名发生了改变,所以在这里造出的那个对象就不一样了。如果你这个类名是user,那这造出的对象就是user对象,如果你这个地方是一个date日期类型,那你这个地方造出的对象就是一个日期对象。明白什么意思吧,哎,就是个日期对象,那大家思考一下这种方式它的优点在哪?
06:03
这种方式优点在哪,各位?就Java代码不需要做任何改动。一份Java代码可以创建不同类型的对象。那。Java代码写一遍。对吧,哎,在不改变什么Java源代码的基础之上。可以做到什么呀?不同对象的实例化非常之灵活。啊。所以这块呢,不是,呃,也不是安全,各位啊,也不是安全,就是说它是符合什么OCP的一个开发原则的,对吧,符合OCP。叫做开闭原则。对扩展开放。对修改什么关闭。对吧。
07:00
批量实例化,实例化可以啊,那你整个数组呗,是不是你整个数组这多配点类名不就行了吗?这中间中间的逗号隔开多配几个类名对吧?哎,可以没问题啊,就是这种方式呢,我想说的是它的优点在什么地方呢?它的优点在于它的灵活性。灵活性,那我问大家一个问题,在之前如果说你采用你们以前古老的这种方式,User user user,好,我问大家这种方式它的缺点是啥?这种方式代码等于是写死了,是不是创建的这个对象一定是UR对象?但如果你采用下面这种方式,那就不一定了,你创建的对象就不一定是user对象了,取决于你这个配置文件当中的这个类名。对吧,所以这个很巧妙啊,巧妙反射机制是有一定作用的,要不然我们学它干什么呀。对不对,哎,所以这种方式,这种方式代码就写死了。只能创建一个什么user类型的对象?
08:03
对吧,以下代码是灵活的,以下代码是灵活的。啊。哎,代码不需要改动,可以可以修改什么呀,配置文件,配置文件修改之后可以创建出不同的实例对象。啊,很神奇也很巧妙啊,很神奇也很巧妙,那么在这里呢,我要嘱咐一下大家啊,为什么我们要讲反射机制,我要告诉大家。后期你们要学框架,明白吧,后期你们要学习的是高级框架,而工作过程中也都是使用什么呀高级框架。啊,包括什么呀,SSSSM啊啊都有哪些什么?Spring呢,MVC啊,MY啊对吧?哎,Spring呢,Tru啊,Hibernate呀,等等等等啊。
09:06
嗯。这些高级框架底层实现原理。都采用了反射机制,所以反射机制还是重要的,学会了反射机制有利于你去理解框架底层源代码,明白吗?学会了反射机制有利于你理解哎,理解剖析框架底层的什么源代码。啊,源代码实际上是这样的,但如果说如果说你以后你说啊,我这个源代码学不学吧,反正我就学一下框架咋用,如果你要是这种心态的话,那你反射机制可以不学。同学们啊,你反射机制可以不学明白吗?但是如果说你奔着说我将来这个框架底层我搞得很透彻,这些牛人写的这些框架底层原料膜看得很透,那对你的反射机制你得会,反射机制你不会,你代码看不懂。
10:03
明白什么意思吧,所以说呢,这个关键还是比较关键的,一个一个一个内容啊,一个内容,你看这里的代码,你看写的就相当灵活了,是不是特别灵活,你看灵活在什么地方啊,你只要改配置文件就行了,配置文件一改程序就变,配置文件一改程序就变,配置文件只是个普通文件,它不需要编译,对吧?所以你你你以后的开发在框架底层基本上都是这样,框架大部分都是写配置文件。你以后用SSM或SSH开发,你就会发现大部分时间在写配置文件。都是在写配置,把配置改一改就行了,程序就能运行了,程序就能运行了,而且你你改成不同的配置,它有不同的效果啊,它有不同效果,这是反射机制的一个一个重要的一个一个特点啊,其实别人在问你反射制有什么用啊,你告诉他反射机制可以访问class文件,反射机制可以让腾讯更加灵活啊,这就是反射机制它的作用啊,就在这里你可以回答这个问题了,就反射机制到底有什么用。
11:03
它可以去操作自解码文件,可以让你的程序变得更加灵活啊,更加灵活不是那么死板啊。好了,这个呢,我就说到这儿吧,各位啊,这个我就说到这儿,你看再执执行,你看他创建的这个对象,什么对象啊,就是一个哎,日期对象,你看见没有,哎日期对象,但你把这个名字给他改一下。是不是赶紧给他改一下?改成这个user,那这个时候他创建的对象就变了,你看他就创建的对象就不是这个对象了,就是别的对象了,你看。是不是啊,还是很奇妙的啊,很奇妙的。
我来说两句