heting

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  40 随笔 :: 9 文章 :: 45 评论 :: 0 Trackbacks
void f();{    
Cleaner cleaner
=new Cleaner();;    
try    
{    
  Connection conn 
= ;    
  cleaner.add(conn);;    
  Statement stmt 
= conn.createStatement();;    
  cleaner.add(stmt );;    
  ResultSet rset 
= ;    
  cleaner.add(rset );;    
   
//using ResultSet   
  cleaner.clean();//close rset   
}
    
catch(Exception e);    
{    
throw new RuntimeException("",e);;    
}
    
finally    
{    
cleaner.cleanAll();;    
}
    
}
  

import java.io.InputStream;   
import java.lang.reflect.Method;   
import java.net.Socket;   
import java.sql.Connection;   
import java.sql.PreparedStatement;   
import java.sql.ResultSet;   
import java.sql.Statement;   
import java.util.HashMap;   
import java.util.Iterator;   
import java.util.Map;   
import java.util.Stack;   
  
/**  
 * 
@author pufan  
 *   
 
*/
  
public final class Cleaner   
{   
    
public static interface CleanListener   
    
{   
        
void catchClean(Object obj, Throwable t);;   
    }
   
    
private final static CleanListener NONE_LISTENER = new CleanListener();   
    
{   
        
public void catchClean(Object obj, Throwable t);   
        
{   
        }
   
    }
;   
    
private final static Map map = new HashMap();   
    
{   
        
{   
            put(Connection.
class"close");;   
            put(Statement.
class"close");;   
            put(PreparedStatement.
class"close");;   
            put(ResultSet.
class"close");;   
            put(InputStream.
class"close");;   
            put(Socket.
class"close");;   
        }
   
    }
;   
    
private final Stack garbageContainer = new Stack();;   
    
public void add(Object garbage);   
    
{   
       add(garbage, NONE_LISTENER);;   
    }
   
    
public void add(Object garbage, CleanListener listener);   
    
{   
        garbageContainer.add(
new Garbage(garbage, listener););;   
    }
   
    
public void clean();   
    
{   
        
if (garbageContainer.size(); > 0);   
            
try  
            
{   
                doClean();;   
            }
   
            
catch (Throwable e);   
            
{   
                throwThrowable(e);;   
            }
   
    }
   
    
private void doClean(); throws Throwable   
    
{   
        Garbage garbage 
= (Garbage); garbageContainer.pop();;   
        garbage.clean();;   
    }
   
    
public void cleanAll();   
    
{   
        Throwable throwable 
= null;   
        
while (garbageContainer.size(); > 0);   
            
try  
            
{   
                doClean();;   
            }
   
            
catch (Throwable t);   
            
{   
                
if (throwable == null);   
                    throwable 
= t;   
            }
   
        throwThrowable(throwable);;   
    }
   
    
private void throwThrowable(Throwable throwable);   
    
{   
        
if (throwable == null);   
            
return;   
        
if (throwable instanceof Error);   
            
throw (Error); throwable;   
        
else  
            
throw new RuntimeException("error in closing garbage!", throwable);;   
    }
   
    
private static Method getMethod(Object obj);   
    
{   
        Class clazz 
= obj.getClass();;   
        String methodName 
= getMethodName(clazz);;   
        
try  
        
{   
            
return clazz.getMethod(methodName, new Class[0]);;   
        }
   
        
catch (Exception e);   
        
{   
            
throw new RuntimeException("can't find close method by " + obj, e);;   
        }
   
    }
   
    
private static String getMethodName(Class clazz);   
    
{   
        
for (Iterator it = map.keySet();.iterator();; it.hasNext();; );   
        
{   
            Class c 
= (Class); it.next();;   
            
if (c.isAssignableFrom(clazz););   
                
return (String); map.get(c);;   
        }
   
        
return null;   
    }
   
    
private static class Garbage   
    
{   
        Object obj;   
        Method method;   
        CleanListener listener;   
        Garbage(Object obj, CleanListener listener);   
        
{   
            method 
= getMethod(obj);;   
            
this.obj = obj;   
            
this.listener = listener;   
        }
   
        
void clean(); throws Throwable   
        
{   
            
try  
            
{   
                method.invoke(obj, 
new Object[0]);;   
            }
   
            
catch (Throwable t);   
            
{   
                listener.catchClean(obj, t);;   
                
throw t;   
            }
   
        }
   
    }
   
}
  
posted on 2009-01-10 10:01 贺挺 阅读(162) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: