当前位置: 首页 > 面试题库 >

IDE风格的程序正在运行

阳宾实
2023-03-14
问题内容

我的目标

我试图做一个Java程序中,用户可以选择任何.class.jar从他们的计算机文件。然后,我的程序将弹出一个JInternalFrame带有a
JEditorPane的控制台,以捕获用户程序中任何控制台输出。当用户程序关闭(调用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 that\nreturns void and takes in an array of Strings",
                                                "No main method", javax.swing.JOptionPane.ERROR_MESSAGE);
  }

该方法成功调用了程序的main方法,并运行了该程序的副本。但是,当此集线器启动任何程序时,都会调用该System.exit(int status)命令,该集线器也将关闭。另外,关于如何捕获控制台输出,我丝毫没有任何线索。

我的问题

是否有人愿意分享任何经验或建议,以帮助我制定一个功能齐全的程序,可以…

  1. 打开并运行一个已编译的Java文件(请记住,.jar文件中的方法可能具有多个类main(String[] args)
  2. 进行捕获, System.exit(int status);以便中心程序处理内部程序的退出
  3. 捕获new java.io.PrintStream().println(Object o)和类似的呼叫,并将其输出放在JEditorPane
  4. 创建一个按钮,当按下该按钮时,它将停止内部程序的运行
  5. 可能JFrame将内部程序使用的所有内容都转换为JInternalFrames并将它们放置在JDesktopPane

问题答案:

如果您不希望另一个程序(通过它的主要方法调用)能够关闭正在运行的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

例如,在单独的JVM中运行其他程序 ProcessBuilder

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.改用关机钩

不要禁止终止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.


 类似资料:
  • 我正在用SWING用JAVA开发一个图形用户界面应用程序。当我试图从Netbean IDE运行图形用户界面时,我遇到了一个问题,一旦图形用户界面运行,我就无法在界面上点击或做任何事情,换句话说,我无法与用户界面交互。例如,当我尝试按下一个按钮时,它什么也不做,就像冻结一样,但是它不会显示任何错误,你可以正常关闭它(x图标)。这是一张照片 有人知道如何解决这个问题吗? 我用的是Ubuntu 14.0

  • 本章探讨如何将ES6的新语法,运用到编码实践之中,与传统的JavaScript语法结合在一起,写出合理的、易于阅读和维护的代码。 多家公司和组织已经公开了它们的风格规范,具体可参阅jscs.info,下面的内容主要参考了Airbnb的JavaScript风格规范。 块级作用域 (1)let取代var ES6提出了两个新的声明变量的命令:let和const。其中,let完全可以取代var,因为两者语

  • 概述 “编程风格”(programming style)指的是编写代码的样式规则。不同的程序员,往往有不同的编程风格。 有人说,编译器的规范叫做“语法规则”(grammar),这是程序员必须遵守的;而编译器忽略的部分,就叫“编程风格”(programming style),这是程序员可以自由选择的。这种说法不完全正确,程序员固然可以自由选择编程风格,但是好的编程风格有助于写出质量更高、错误更少、更

  • 问题内容: 我有一个Spring Boot应用程序,需要: 可作为战争部署在servlet容器中 可通过运行 我还希望能够通过右键单击main并运行它在IDE(Eclipse或IntelliJ IDEA社区)中运行此应用程序。 这是我pom.xml有趣的部分(请注意,我不是从spring-boot-starter-parent pom继承的): 这是我的 在IDE中运行main时,出现以下错误:

  • 上周,我完成了一个测试应用程序的开发,并在所有模拟器中成功运行了它。今天我决定考虑发布这个应用程序,并使用了“Sent Android Build”。生成状态“成功”。然后尝试从命令行运行jar,得到: 所以试图逃离GUI并得到: Java版本: 我在Suse Linux 42.1 64b上使用Netbeans(这是新的)。 我在什么地方丢了一个图书馆吗?还是别的什么?

  • 所谓"编程风格"(programming style),指的是编写代码的样式规则。不同的程序员,往往有不同的编程风格。 有人说,编译器的规范叫做"语法规则"(grammar),这是程序员必须遵守的;而编译器忽略的部分,就叫"编程风格"(programming style),这是程序员可以自由选择的。这种说法不完全正确,程序员固然可以自由选择编程风格,但是好的编程风格有助于写出质量更高、错误更少、更