我有一个在主机上运行的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程序的方法。
非常感谢。
祝你好运 凯文
答案 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并使用此类启动该程序。