创建一个通用方法来组合多个.close()连接方法

时间:2015-08-05 06:39:34

标签: java generics

我有这4个方法,每个方法都关闭不同的连接类型,这意味着每个方法都有不同的输入对象。每个方法都在提供的输入对象上调用close()方法。有没有办法将这些方法合并为一个,接受一个通用对象?我无法在提供的对象上实现接口或扩展它们。

import java.sql.Statement;
import javax.jms.Connection;
import javax.mail.Transport;

private void close(Statement stm) {
    if(stm == null) {
        return;
    }

    try {
        stm.close();
    } catch (SQLException ex) {
        logger.error("Error while closing statement", ex);
    }
}

private void close(java.sql.Connection con) {
    if(con == null) {
        return;
    }

    try {
        con.close();
    } catch (SQLException ex) {
        logger.error("Error while closing connection", ex);
    }
}
private void close(javax.jms.Connection con) {
        if(con == null) {
            return;
        }

        try {
            con.close();
        } catch(JMSException ex) {
            logger.error("Error while closing JMS connection", ex);
        }
    }

private void close(Transport transport) {
        if(transport == null) {
            return;
        }

        try {
            transport.close();
        } catch (MessagingException ex) {
            logger.error("Error while closing mail transport", ex);
        }
    }

修改 感谢您关于Java 1.7的答案。不幸的是我们的服务器运行的是Java 1.6,所以有什么解决方案吗?

2 个答案:

答案 0 :(得分:3)

您可以使用反射。 第一个示例为您提供了对资源的try()的支持:

@Test
public void testRes() throws Exception {
    try(ClosableWrapper<StringWriter> rs = new ClosableWrapper<>(new StringWriter())){
        Writer wr = rs.getResource();
    }
}
static class ClosableWrapper<T> implements AutoCloseable{
    private T resource;
    private String closeMethod = "close";

    public ClosableWrapper(T resource) {
        this.resource = resource;
    }

    public ClosableWrapper(T resource, String closeMethod) {
        this.resource = resource;
        this.closeMethod = closeMethod;
    }

    public T getResource() {
        return resource;
    }

    @Override
    public void close() throws Exception {
        if(resource!=null){
            Method m = resource.getClass().getMethod(closeMethod);
            m.invoke(resource);
        }
    }
}

或只是一种方法:

public void close(Object resource) throws Exception {
    if(resource!=null){
        Method m = resource.getClass().getMethod("close");
        m.invoke(resource);
    }
}

答案 1 :(得分:2)

假设这些是您的类,请使用AutoCloseable接口并将它们放在try-with-resource中。