通杀一切的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】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值