java – IDE风格的程序运行
我的目标
我正在尝试创建一个Java程序,用户可以从他们的计算机中选择任何.class或.jar文件.然后我的程序会弹出一个带有JEditorPane的JInternalFrame作为控制台,捕获用户程序的任何控制台输出.当用户的程序关闭(调用System.exit(int status);)时,我的程序不能随之关闭.我的程序可能还有一个功能,如立即停止用户程序的按钮和IDE的其他功能.我的程序不需要编译Java代码,只需运行.class和.jar文件. 我的经验 我已经制作了这个程序的一个小测试版本,其中我从一个包中获得了两个特定文件,并让用户单击两个按钮中的一个,每个按钮代表两个程序中的一个.按一下按钮会调用以下方法: private void run(Class runnable) { java.lang.reflect.Method[] m = runnable.getMethods(); boolean hasMain = false; for (int i = 0; i < m.length; i++) { if (m[i].getName().equals("main") && m[i].getParameterTypes()[0].isArray() && m[i].getParameterTypes()[0].getName().contains("java.lang.String")) try { Object invoke = m[i].invoke(null,(Object)globalArgs); hasMain = true; hub.setExtendedState(Hub.ICONIFIED); numPrograms++; } catch (Throwable t) { java.util.logging.Logger.getLogger(Hub.class.getName()).log(java.util.logging.Level.SEVERE,null,t); javax.swing.JOptionPane.showMessageDialog(null,"Could not run " + runnable.getName(),"Error in invocation",javax.swing.JOptionPane.ERROR_MESSAGE); } finally { break; } } if (!hasMain) javax.swing.JOptionPane.showMessageDialog(null,runnable.getName() + " does not have a public static main method thatnreturns void and takes in an array of Strings","No main method",javax.swing.JOptionPane.ERROR_MESSAGE); } 此方法成功调用程序的main方法并运行所述程序的副本.但是,当此集线器已启动的任何程序调用System.exit(int status)命令时,集线器也会关闭.另外,我对如何捕获控制台输出没有丝毫的线索. 我的问题 有没有人有任何经验或建议他们愿意分享,以帮助我制作一个功能齐全的程序,可以…… >打开并运行一个已编译的Java文件(请记住.jar文件可能有多个带有main(String [] args)方法的类) 解决方法
如果您不希望其他程序(通过它的主方法调用)能够关闭您正在运行的JVM,那么我可以看到三个选项:
1.使用SecurityManager 设置SecurityManager以防止System.exit调用: public class Test { public static void main(String args[]) { SecurityManager sm = System.getSecurityManager(); System.setSecurityManager(new SecurityManager() { @Override public void checkExit(int status) { throw new SecurityException("Client program exited."); } }); try { System.out.println("hello"); System.exit(0); System.out.println("world"); } catch (SecurityException se) { System.out.println(se.getMessage()); } } } 打印: hello Client program exited. 这可能是最好的解决方案.这是应用程序服务器阻止任意servlet终止整个服务器的方式. 2.单独的JVM 使用例如ProcessBuilder在单独的JVM中运行其他程序 import java.io.*; public class Test { public static void main(String args[]) throws IOException { ProcessBuilder pb = new ProcessBuilder("java","other.Program"); pb.redirectErrorStream(); Process p = pb.start(); InputStream is = p.getInputStream(); int ch; while ((ch = is.read()) != -1) System.out.print((char) ch); is.close(); System.out.println("Client program done."); } } 3.改用shutdown hooks 不要禁止终止JVM,而是添加关闭钩子来清理“集线器”并正常退出. (如果您一次运行一个“外部”程序,此选项可能才有意义.) import java.io.*; public class Test { public static void main(String args[]) throws IOException { Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { System.out.println("Uninitializing hub..."); System.out.println("Exiting gracefully."); } }); // Run client program System.out.println("Running... running... running..."); System.exit(0); } } 打印: Running... running... running... Uninitializing hub... Exiting gracefully. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java – 启用CORS发送请求从AngularJS到泽西
- java – 跨平台桌面开发
- java – 使用apache commons编解码器的Base64解码
- 【SpringBoot】16. 如何监控springboot的健康状况
- java – Spring:使用工厂bean创建任意数量的bea
- java – 仅获取时间戳记的日期
- java – 带有c的JNI不断崩溃cout,printf和方法调
- java – 从哪里调用public static void main?
- springboot+Oauth2实现自定义AuthenticationMana
- STM32 HAL库重新设置中断向量表后,无法进入中断