外部java程序:处理SIGTERM

时间:2014-08-16 12:24:15

标签: java swing signals sigterm

我有一个在主机上运行的java程序(带有一个gui)。在运行时,用户可以添加一些数据记录。该程序只适用于他们。

稍后系统可能会关闭,或者程序刚刚被SIGTERM关闭。

不幸的是,如果用户用“X”手动关闭数据记录,那么porgram似乎只存储数据记录。

现在我遇到的问题是,如果程序被SIGTERM关闭,我可能会丢失一些数据。不幸的是,没有联系电子邮件地址要求作者进行更改。

我试图用“jd gui”反编译它,它似乎或多或少有效。我想当时我可以添加信号处理程序并调用“窗口关闭”方法。

但是“jd gui”创建了这样的代码:

/* 110:269 */       if ((??? = Thread.currentThread().getContextClassLoader()) != null) {
/* 111:270 */         return ???;

如果我尝试编译源代码,我还会遇到很多其他错误。

我认为这是因为jar文件被某些工具混淆了。不幸的是,反编译的代码不起作用,我无法使用JFrame重新编译该文件。

长话短说: 是否有可能编写一个“包装器程序”,它只处理SIGTERM,然后调用主框架(它是唯一的JFrame)的JFrame“close方法”(或它的调用方式)?

我只是不知道如何调用这种外部运行java程序的方法。

非常感谢。

祝你好运 凯文

2 个答案:

答案 0 :(得分:1)

尝试对应用程序进行反混淆处理。看看(2009) - Tool to deobfuscate Java codes

也许有可能解决来源,以便您能够深入挖掘 来源并编译它。

否则从包装器应用程序外部挂钩到基于Swing的ui事件队列是非常复杂的。

也许您可以反编译主类并将其主方法替换为您自己的和 添加shutdownhook请参阅:Useful example of a shutdown hook in Java?调用onClose(反混淆)方法。

任何方式,一个有趣且充满挑战的问题!

答案 1 :(得分:1)

使用main方法创建自己的类,该方法在关闭之前安装要保存的关闭钩子。然后调用原始程序的main方法。将其添加到jar并使用此类启动该程序。