对Java反射的理解

一直记不住java反射是什么,虽然看了很多遍,就像迪杰斯特拉算法,看过很多遍却还是容易遗忘,那是因为你没有通过形象去理解。因为只有抽象的东西才需要去死记硬背,而形象的东西根本就不需要语言去描述。

理解一样东西首先要知道为什么需要这个东西,它存在的意义是什么,它要解决哪些场景。然后,可以用类比的方式将它形象化,把它比喻成另一种更常见的更容易理解的东西。也许它有很多方面,但可以先从一个方面入手,不需要追求全面,我们可以先片面的理解。

举一个例子,手机和电话卡,手机为什么不和卡绑定在一起呢,为什么要插卡,因为做这个手机的时候不知道谁会使用它,如果手机预先封装了号码,那我想换号咋办,是不是得换手机,那多不灵活,所以就把号码先空出来,给用户自己去设置。反射要解决的场景就是这样。

反射是用来设计框架的。在平常普通开发中很少用到反射,但面试要造原子弹要看源码……也就是说反射是手机的一种制造技术,虽然我们平时只是在使用手机,但偶尔也想了解一下手机的内部原理。

有三种层次的人:语言的设计者,框架的设计者,框架的使用者。想要理解框架的原理,就需要站在设计者的角度而不是使用者的角度。框架就像作文模板,my name is xxx,大部分固定的通用的东西都帮你写好了,剩下的需要根据你的具体情况去填。框架设计者总是面临着一个权衡,就是灵活性和便捷性的矛盾,就像公交车和私家车。当你需要留白的时候怎么办,怎么把用户的自定义设置给衔接进来,就像手机的读卡技术,这涉及到语言的语法问题。

反射的具体场景是这样:当一个类需要留白的时候怎么办?比如说我是框架设计者,我知道这里需要用到一个类,或者说按照我的设计,我想在这里使用一个类,但为了灵活性,我想让用户来指定这里具体用什么类,因为根据不同的情况可以用不同的类,就像spring mybatis用户可以随便配置各种类一样。假如说,假如没有反射这种语法,那就没法设计了,因为框架也是代码,我想写xxx=new Xxx() ,但我现在想把Xxx留空,而且后面还得用到xxx. 什么什么方法什么什么属性,按照正常的写法肯定没法写了。你不能让用户在这里写,因为这里是你框架的源码,你不能让用户来修改你的框架。而spring mybatis的用户是怎么做的,他们只需要配置文件中写上类的全名,框架中的留白就能衔接上了,这是怎么做到的呢?这就需要用一些不正常的语法。

语言是在不断发展的,语言可以说是框架的框架,但框架设计者抱怨正常的或者说现有的语法无法解决某些场景的时候,语言的设计者就要对语言做出改进了,比如增加一些新的语法,因此语言也变得越来越强大越来越复杂。也许java一开始并没有反射,后来为了迎合框架设计的这种需要才把反射这种机制加进去的。

这就是反射存在的意义,而反射的语法细节非常复杂,涉及到jvm 类加载
Class对象可以理解为身份证或者学生证,工牌,仅此一份,在第一次使用的时候才办理,类可以理解为你本人,new出来的对象可以理解为你像孙悟空一样拔毛变出的复制版的你,反射就是,别人用你的身份证也可以变出复制版的你,所以你只需要把身份证给别人而不需要亲自拔毛

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值