|
为了简短地演示一下反射的部分能力,我把这段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】 |
|