Java中的反射与代理(1)

即使很多有一定开发经验的工程师,在被问到反射与动态代理相关的问题时,可能仍然模棱两可,答不完整(例如,认为Class.forName()就是反射的全部)。Java开发中大名鼎鼎的Spring框架,它最为核心的依赖注入功能就是通过反射和代理来实现的。

不仅仅是Spring,在远程方法调用RMI、远程过程调用RPC中也都有反射和代理的影子。

不过,如果不需要自己动手开发一个框架,那么反射和动态代理其实了解一下就可以了。

Java有一句著名的口号就是「Everything is an Object」——Object是整个Java中所有类的父类(就像中国的女娲、外国的普罗米修斯一样)。除了这个Object外,还有一个Class类,它是用来描述每个类的类型信息的,也就是给每个类建立了档案,如构造器、属性、方法、实现接口、继承结构等等。就像民政局的花名册一样,谁是谁的爸爸,谁是谁的孙子,年龄、性别、家庭住址等等全都登记在册。

但Class类并不是给开发者开发用的,也没有公共的构造方法,它是由ClassLoader加载、JVM自动构造的,不需要工程师干预,也干预不了。一个类在JVM中就只有一个Class实例。类的实例化过程是这样的:

所以,反射的本质是:JVM得到编译过的.class文件后,加载到JVM中,通过Class获取到对象的各种信息,再根据这些信息创建所需的对象实例或变量的引用值。

在侏罗纪公园,科学家拿到了蚊子吸的恐龙血,然后就通过这些远古的血液样本,又让恐龙复活过来。这两者的过程非常相像:

C++中有一个叫做RTTI(运行时类型识别)的概念,但Java是没有这个概念的,JSR规范里面也没有,Java只有反射的概念(所以如果有面试官问到Java中的RTTI时,就别往坑里跳了)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值