`
tedeyang
  • 浏览: 319092 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

通杀一切的close方法

阅读更多

为了简短地演示一下反射的部分能力,我把这段API拿出来展览一下:

API设计思路概述:

java类库中有很多类都具有一个“close”方法,譬如ResultSet,Statement,Connection,InputStream等捏着计算机资源的类,他们需要在程序结束时释放资源,否则可能引起严重的资源泄漏,而这个方法一般都叫做close。

我在开发税款联网时,需要频繁地读写文件、处理数据库连接,处理数据流,在退出一个流程前需要写一大堆close语句。写了七八个close以后,我的懒劲发作了:决定写一个通用的关闭工具。

既然要通用,那么就要挖掘操作对象的共性,显然它们的共性只有一个:都具有close方法,但没有共同接口。在OOP上无法做文章,幸好Java是具有强大动态能力的语言,我们还可以用“反射”!

代码如下:

================================================================ 
 

/**
 * ReflectTool.java
 * Nov 17, 2006
 */
package cn.tohot.util;

import java.lang.reflect.Method;

/**
 * @author
 */
public class ReflectTool {
 /**
  * 调用Object的methodName方法 使用反射,查找类是否具有该方法(无参数,无返回值),如果有则调用
  * 屏蔽所有异常
  * @param objects
  */
 public static void call(Object object, String methodName) {
  if (object == null || methodName == null || methodName.matches("^\\s*$"))
   return;
  Class c = object.getClass();
  Method method = null;
  try {
   if ((method = c.getMethod(methodName, null)) != null)
    method.invoke(object, null);
  } catch (Exception e) {
  }
 }

 /**
  * 依次调用call()
  *
  * @see #call(Object, String)
  * @param objects
  * @param methodName
  */
 public static void call(Object[] objects, String methodName) {
  for (int i = 0; i < objects.length; i++) {
   call(objects[i ], methodName);
  }
 }

 /**
  * 实际调用call(Object[],"close")
  * @param objArray
  */
 public static void closeAll(Object[] objArray) {
  call(objArray, "close");
 }
}

 

代码很简单,不管你是什么类,只要你有close方法,我就能调用你
不过这里我是管杀不管埋的——异常被catch掉了——因为在关闭资源时如果发生异常,
我们其实无能为力,什么都做不了,所以我简单粗暴地把异常扼杀在了摇篮里。
可以用如下的代码调用:
  DataWriter writer = new DataWriter(new BufferedWriter(new FileWriter(path)));
  line.setNeedGbhy(CommonLogic.needGbhy(this));

  Connection conn = null;
  Savepoint middle = null;
PreparedStatement pst = null, pst1 = null, pst2 = null;
  ResultSet rs = null;
    ....
    ....
 ReflectTool.closeAll(new Object[] { rs, pst, pst1, pst2, conn, writer });


注:DataWriter 是我自定义的类,也有close方法。
如果你仔细看,会发现call是一个通用方法,它并不是局限于close的。



【2008-1】
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics