首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有exit命令而输入的exit()方法

没有exit命令而输入的exit()方法
EN

Stack Overflow用户
提问于 2016-06-06 13:26:45
回答 4查看 159关注 0票数 2

我已经处理了3个代码,显示了一些奇怪的行为。我定义了一个void exit()方法,它是在没有用户实际告诉代码退出的情况下随机执行的。以下是一种方法:

代码语言:javascript
复制
void exit()
{
 println("clearing buffer and closing file");
 if (output != null) {
   print("output is not null");
   try {
     output.close();
   } 
   catch (IOException e) {
     println("Error while closing the writer");
   }
 }
 super.exit();
}

如您所见,它所做的唯一一件事就是试图关闭一个名为output的缓冲编写器。冲洗这个作家不是关键,所以现在我只是把它从我的草图中删除。但从长远来看,我很好奇这是如何发生的。在我的代码中,没有其他地方是显式调用exit方法的。呃,代码不能决定退出。只有当用户使用X关闭问题时,才会使用X。

注意:我不能上传整个代码,这个方法也是附加的,因为它太长了。我想更好的表达我的问题的方法可能是:

“嗨,我是一个不知道退出方法的菜鸟。不管怎么说,这个方法可以在我不显式调用它或按退出按钮的情况下被调用吗?”

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-06-06 14:25:29

将其添加到exit()方法的开头。

代码语言:javascript
复制
    new Exception().printStackTrace();

由此产生的堆栈跟踪应该允许您找出调用exit()方法的方法。

如果不能调整代码,则可以使用调试器运行应用程序,并在exit()方法开始时设置断点。

要回答你关于这是否可能的问题,答案取决于你所说的“没有我明确的呼唤”。调用方法有多种方法,其中有些方法非常模糊。

  • 可以使用反射从声明类中获取exit方法的exit对象,然后在其上调用invoke(...)
  • 您可以通过JNI或JNI从本机代码调用Java方法。
  • 您可以生成包含exit()调用的Java源代码,编译它,加载它,并运行它。
  • 您可以使用BCEL或类似的方法将exit()调用插入到“无害”方法中。

还有..。

  • 如果有一个调试代理附加到JVM,调试器可以在JVM中的某个线程上调用exit()
票数 3
EN

Stack Overflow用户

发布于 2016-06-06 13:47:04

简而言之,你的问题的答案是肯定的。

可以使用同一类加载器中的任何类或层次结构中的任何其他类动态地找到和调用您的方法。

此外,它还具有默认访问权限。因此,它可以由同一个包中的任何类静态地调用。

票数 0
EN

Stack Overflow用户

发布于 2016-06-06 14:23:51

+1对于@Andres,反射是一种可能性。

您试过在方法上使用断点并查看线程的堆栈跟踪吗?

就我个人而言,我不使用断点(只是我的风格),我会尝试以编程的方式查看线程。也许下面的一些代码可以帮助您查看线程并了解所发生的事情:

代码语言:javascript
复制
public class ThreadUtil {

    /** Blocked constructor **/
    private ThreadUtil() {
    }

    /**
     * Get the stackstrace of the current {@link Thread}.
     * The stacktrace will be returned in the form of a string.
     */
    public static String getStackTrace() {
        return getStackTrace(Thread.currentThread());
    }

    /**
     * Get the stackstrace of a {@link Thread}.
     * The stacktrace will be returned in the form of a string.
     */
    public static String getStackTrace(Thread thread) {
        StringBuilder sb = new StringBuilder();
        StackTraceElement[] currThreadStackTraceElementList = thread.getStackTrace();
        appendStackTrace(sb, currThreadStackTraceElementList);
        return sb.toString();
    }

    public static String getAllStackTraces() {
        StringBuilder sb = new StringBuilder();
        Map<Thread, StackTraceElement[]> threadList = Thread.getAllStackTraces();
        for (StackTraceElement[] currThreadStackTraceElementList : threadList.values()) {
            appendStackTrace(sb, currThreadStackTraceElementList);
        }
        return sb.toString();
    }

    private static void appendStackTrace(StringBuilder sb,
            StackTraceElement[] currThreadStackTraceElementList) {
        sb.append("Thread stack trace: \n");
        for (StackTraceElement currThreadStackTraceElement : currThreadStackTraceElementList) {
            sb.append("\t" + currThreadStackTraceElement + "\n");
        }
        sb.append("\n");
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37658731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档