日期:2014-05-20  浏览次数:20729 次

java中的反射机制疑问
如果在得知第三方库api的前提下,是否反射机制就可以不用了呢?
我想到知道,是否有这样的情况:即便你可以得到第三方库的api,但还有某个特定的需要在不用反射的前提下无法完成。
望赐教!
也希望哪位大侠给个例子,从中可以看出,反射确实给程序带来了方便(对比不用反射)

------解决方案--------------------
这种例子比较少见,倒是确实碰到过.例子不好找,给你个说明,你自己去模拟.
一个classloader1加载了类A,你可以得到A的实例a,这种情况下,你在你的ide中写这样的语句:
A a1=a;
这个会报错,报一个ClassCastException,所以这种情况下,要使用a这个实例,必须写为:
Object a1=a;
然后用反射调用它的方法.
你需要仔细琢磨这之间的区别.为什么会报类型转换的错误.
------解决方案--------------------
我是觉得反射的作用主要还是用来做IDE的,否则IDE怎么给你做提示啊?
另外一个常用的作用就是为了动态加载,通过一个配置文件的配置,可以很方便的切换实现模块。
至于你说的“得知第三方库api的前提下,是否反射机制就可以不用了呢”这个问题,其实我很疑惑,什么情况下你会对一个库或者类的作用一无所知的情况下,去实际使用它呢?反射只是能告诉你这个类有哪些字段,方法,你还可以得到那个类实例。但是,你都不知道每个方法具体是干什么的,你就敢实际使用么?
------解决方案--------------------
我的理解:反射机制对工程的意义大于单个的程序。很多框架(比如spring)的配置文件都要求输入你用到的类名,在程序加载的时候classloader就会根据类名去找这个类。你想想,如果没有反射机制的话,你就必须自己去修改spring的源代码,把你自己定义的类加上去。
反射机制还应用到java的很多模式中。比如ArrayList这个类,它的api大家都清楚吧,但是有一个特殊需求:请你自己创建一个容器类,这个类对ArrayList进行了封装,它能够捕捉放到它里面的第一个对象的类型,以后往里面插入的对象,必须跟第一个对象的类型相同。这个问题你可以用静态代理模式来做,但是这么做你会发现你只想要修改ArrayList的add动作,但是其它动作你也不得不重复实现一遍,否则你封装的ArrayList提供的方法就会少得多。这个时候如果你用动态代理来做,就很简单,你只需要在用户调用ArrayList的add方法时截获这个调用,然后判断就可以了。
如果仅从程序的角度来看,有没有反射机制无所谓,反正功能都能实现。但是从软件工程的角度来看,反射机制的出现,让程序更加灵活,且更容易实现。

------解决方案--------------------
反射机制功能很强大,如果要使程序具有通用性,便于以后的重用。
struts,sprinng,hibernate好多框架底层都大量运用了反射机制。