Java “反射”的乐趣

        记得很久之前,就在一篇博文那里看到说“反射”是Java的一大精华。当时还不懂,现在接触的项目越来越多之后,才慢慢感受的反射的妙用。

        反射是什么?

        反射在java里面指的就是反射机制了,在百度百科里面:JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

         好吧,以前的我完全不知道这是人话。

         我们先来理一下思路:我们大家都知道,Java从编写到运行,肯定是要经过两个时期的:编译期,运行期,如图:



上面加黑的两句话就是说在编译出Class文件的时候,还可以不用确定是什么类型的class。举个栗子:就拿我之前的博文里面提到的BaseDaoImpl<T>(详细情况可看博文:http://blog.csdn.net/kklt21cn/article/details/42040597

在编译过后产生的class文件里面,是没有对哪个实体类的对象的引用的,换句人话说就是在class文件还没有跑起来的时候都不知道要调用的是哪个实体。

但是,我们又要知道以后我们在运行时所调用的实体的名字,因为我们要知道名字,我们才能写出它的hql语句。如何才能做到呢?答案就是反射啦!

        其实,在java里面,我们可以理解为class文件,也是一种对象,这种对象就是类对象(class对象)。当我们能拿到class对象时,我们能通过class对象的反射,来运行它所有的方法(method),或者是获得它的属性(field)。这样子,我们就可以在编写代码时候,不必在编译期的时候就要确定类型,可以等到运行期的时候才确定了。

        反射能做什么?

        反射的用处其实在我们的日常代码里面无处不在的。比如我之前所说的BaseDaoImpl,可以减少大量的冗余代码,再比如说框架里面的组件,例如:ommons-lang.jar。里面一个我比较喜欢使用的一个工具类BeanUtils,其中里面的一个赋值的方法copyProperties(Object source ,Object target)。里面就是用了反射来把一个javaBean的值赋给另一个JavaBean。还有利用反射,可以来完成注解。如果对注解感兴趣的童鞋可以看看这个链接http://www.zhihu.com/question/24401191。里面的第一个回答,有大牛已经从底层解释了如何实现的了。

        其实反射只是Java语言的特性之一而已。我个人是感觉慢慢理解这些高级的特性,才算是对一门语言入了门。也能从语言设计的角度,去思考一门语言的价值。只有这样,才能算是一个真正的工程师,而不仅仅是一个只会复制黏贴的码农!

        若有纰漏,欢迎指正。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值