Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用java中尚不存在的方法_Java - Fatal编程技术网

调用java中尚不存在的方法

调用java中尚不存在的方法,java,Java,我正在尝试用java进行自动错误处理。其他人可以调用我的错误处理方法,它为他们处理错误。我正在尝试这样做,如果调用我的方法的类有一个close()方法,我可以调用它,它将关闭所有防止资源泄漏的内容。我试过这样的方法: public void logError(Error e, Object obj){ obj.close(); } 唯一的问题是,这不会运行,因为默认情况下,对象没有close()方法。我可以创建自己的对象并让他们的类对其进行扩展,但如果他们想扩展另一个类,它将无法工作。您需

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

public void logError(Error e, Object obj){
  obj.close();
}
唯一的问题是,这不会运行,因为默认情况下,对象没有close()方法。我可以创建自己的对象并让他们的类对其进行扩展,但如果他们想扩展另一个类,它将无法工作。

您需要一个接口:

interface Closeable {
   public void close();
}
否则,您可以通过反射来检查对象。

您需要一个界面:

interface Closeable {
   public void close();
}

否则,您可以通过反射来检查对象。

如果您在日志记录方法中关闭资源,我认为您存在设计问题。正如其他人所提到的,使用一个接口并处理关闭其他地方的资源

如果你真的想继续使用这种方法,你需要使用反射。下面的调用将抛出一些您需要捕获的异常

public void logError(Error e, Object obj)
{
    Method closeMethod = obj.getClass().getMethod("close", null)
    if (closeMethod != null)
        closeMethod.invoke(obj, null);

我认为,如果在日志记录方法中关闭资源,则会出现设计问题。正如其他人所提到的,使用一个接口并处理关闭其他地方的资源

如果你真的想继续使用这种方法,你需要使用反射。下面的调用将抛出一些您需要捕获的异常

public void logError(Error e, Object obj)
{
    Method closeMethod = obj.getClass().getMethod("close", null)
    if (closeMethod != null)
        closeMethod.invoke(obj, null);

您可以使用以下选项:

public void logError(Error e, Closeable obj) {
    //do your logging
    obj.close();
}

这将确保您的日志首先尝试关闭
可关闭的对象。如果失败,它将返回到常规
对象
实现。我在这里添加反射只是为了做额外的日志记录,这里根本不需要使用反射,我认为您不应该对未实现
Closeable
的对象手动调用
close()

有关方法重载优先级的信息,请参阅:


答案应该有效,因为任何对象都比
对象更具体,只要它向功能中添加了一些内容。

您可以使用以下选项:

public void logError(Error e, Closeable obj) {
    //do your logging
    obj.close();
}

这将确保您的日志首先尝试关闭
可关闭的对象。如果失败,它将返回到常规
对象
实现。我在这里添加反射只是为了做额外的日志记录,这里根本不需要使用反射,我认为您不应该对未实现
Closeable
的对象手动调用
close()

有关方法重载优先级的信息,请参阅:


答案应该是可行的,因为任何对象都比
对象
更具体,只要它为功能添加了一些东西。

如果你真的想这样做,那么你应该检查反射()。你可以创建一个接口,任何想要使用logError方法的类都必须实现。我认为这不是一个好主意。如果您真的想,请查看反射。如果对象实现了反射,是否会使用
尝试finally
使用
Closeable
?我认为应该是这样的,如果你想做的是记录错误(正如你的方法名所暗示的那样),那么就记录它。是否关闭对象由调用方决定。如果确实要关闭对象,则应检查反射()。您可以创建一个接口,任何想要使用logError方法的类都必须实现该接口。我认为这不是一个好主意。如果您真的想,请查看反射。如果对象实现了反射,是否会使用
尝试finally
使用
Closeable
?我认为应该是这样的,如果你想做的是记录错误(正如你的方法名所暗示的那样),那么就记录它。是否关闭对象由调用方决定。如何使方法的参数要求实现closeable。我尝试了public void logError(Error e,Closeable obj),但这只需要一个扩展Closeable的类。如果Closeable是一个接口,那么它需要一个实现该接口的类。如果它期望某个扩展的Closeable,那么您的Closeable不是一个接口,而是一个类。
Closeable
已经是一个接口了。因此,我不建议定义您自己的,而是使用已定义的。已定义的一个不太好用,我创建了自己的,它工作得很好。如何使方法的参数需要实现closeable。我尝试了public void logError(Error e,Closeable obj),但这只需要一个扩展Closeable的类。如果Closeable是一个接口,那么它需要一个实现该接口的类。如果它期望某个扩展的Closeable,那么您的Closeable不是一个接口,而是一个类。
Closeable
已经是一个接口了。因此,我不建议定义你自己的,而是使用已经定义好的。已经定义好的不好用,我自己做了,它工作得很好。