我正在尝试在java中进行自动化错误处理。其他人可以调用我的错误处理方法,并为它们处理错误。我试图这样做,如果调用我的方法的类有一个close()方法,我可以调用它,它会关闭所有阻止资源泄漏。我试过这样的事情:
public void logError(Error e, Object obj){
obj.close();
}
唯一的问题是它不会运行,因为默认情况下对象没有close()方法。我可以创建自己的对象,并让他们的类扩展它,但如果他们想扩展另一个类,它将无法工作。
答案 0 :(得分:5)
您需要一个界面:
interface Closeable {
public void close();
}
否则你可以通过反射检查对象。
答案 1 :(得分:1)
如果您在日志记录方法中关闭资源,我认为您遇到了设计问题。正如其他人所提到的,使用接口并处理在其他地方关闭资源。
如果您真的想继续这种方法,则需要使用反射。下面的调用调用将抛出一些您需要捕获的异常。
public void logError(Error e, Object obj)
{
Method closeMethod = obj.getClass().getMethod("close", null)
if (closeMethod != null)
closeMethod.invoke(obj, null);
答案 2 :(得分:0)
您可以使用以下内容:
public void logError(Error e, Closeable obj) {
//do your logging
obj.close();
}
public void logError(Error e, Object obj){
//do your logging
Method closeMethod = obj.getClass().getMethod("close", null);
if (closeMethod != null) {
//log that the method has a .close() method, but does NOT implement Closeable
}
}
这将确保您的日志记录首先尝试关闭Closeable
对象。如果失败,它将回退到一般Object
实施。我在这里添加了反射 only 来进行额外的日志记录,在这里根本不需要使用反射,我认为你不应该在一个对象上手动调用close()
不实施Closeable
。
对于方法重载优先级,请参阅:http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2
答案应该有效,因为任何对象都更具体Object
,只要它为功能增加了一些东西。