java的反射应用
手头正在做一个项目,在项目中很多地方为了开发的快捷,往往我们总工程师就会要求我们尽量为一组功能相仿的模块写通用的代码,这样可以最大程度的减少工作量。虽然开始写的通用成都高的,可复用程度高的代码会很痛苦,几个算法的设计会让人抓狂!但是一旦完成了,对于我个人来说,那是很兴奋的,这种兴奋,就像当初在学校的时候完成一道理科题目一样,难以抑制。对于项目组来说,那也是一劳永逸的事情。
最近碰到的是为一组向web service发送数据的需求。发送的数据符合xml规范。这样一来,对于服务器端来说,定义这样的数据的时候,自然会根据需求所定义的schema来生成服务器端得数据类型。其实说白了,就是一组xml到javabean的映射关系。对于我们客户端需要访问该web service的时候,只要根据服务器端提供的WSDL,利用xfire等工具生成一组映射好的java类,在根据类中提供的方法,生成对应的对象,把对象发送出去即可。如果有大量的web service需要访问的话,写一个能够通用的方法确实是一个很不错的想法,毕竟重复的设置一些值也是很让人无奈的事情。
为了达到以上目的,很自然的就想到了java中的反射机制,也只有利用反射机制才能很好的完成这样的任务。本来我还想跟项目组说,这任务比较重,我需要很长一段时间才能完成,谁想,总工直接说“用反射嘛,很容易的”,被他这么一说,我原先想着快速利用反射完成任务,接下来的时间就可以舒舒服服过了,一下子成了泡影,哎,还是老老实实工作吧。
以上是一个利用反射的一个情景,通过努力之后,任务完成了,我也想小结一下利用反射时候的认识。面向对象的编程,其实说白了,就是利用对象,完成对象提供的一些服务。有时候,我们也设计对象,为自己,也为别人提供一些便利,但是更多的时候,我们会选择利用别人设计好的比较成熟的对象来更好的更快捷的完成任务,这才是面向对象的变成,代码的最大限度的复用。在使用一个对象的时候,无非要做如下工作:1、生成所需对象的实例,2、为该对象的某些方法准备所需要的数据,3、利用该对象提供的方法,处理这些数据。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
对于这样一个操作,用java的反射来实现的话,就应该是这样的:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class B{
public static void main(String[] arg){
Class c_a = Class.forName(packageName + "." + "A");
Object obj_a = c_a.newInstance();
Method do_m = c_a.getDeclaredMethod("do",new Class[]{});
//prepare data for the mathod
do_m.invoke(obj_a, new Object[]{});
}
}
原本觉得反射挺麻烦的,其实仔细看,想一想,其实反射也是很自然的。就好在其它的C++的代码中,如果需要调用DLL的话,也是需要先声明调用的方法,然后再调用的。反射很类似这种情况。先声明一个方法
Method m = c_a.getDeclaredMethod("do", new Class[]{});
然后再调用
m.invoke(obj_a, new Object[]{});