调用不存在的方法java

时间:2013-12-19 22:15:27

标签: java

我正在尝试在java中进行自动化错误处理。其他人可以调用我的错误处理方法,并为它们处理错误。我试图这样做,如果调用我的方法的类有一个close()方法,我可以调用它,它会关闭所有阻止资源泄漏。我试过这样的事情:

public void logError(Error e, Object obj){
  obj.close();
}

唯一的问题是它不会运行,因为默认情况下对象没有close()方法。我可以创建自己的对象,并让他们的类扩展它,但如果他们想扩展另一个类,它将无法工作。

3 个答案:

答案 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,只要它为功能增加了一些东西。