java - 在这种情况下,新的 JVM 实例或反射会有帮助吗

标签 java reflection jvm jframe classloader

我有一个问题,我之前发布过,但没有得到明确的解决方案

How to prevent JFrame from closing .

所以我发布了一个 SSCCE 可能有助于更好地理解所面临的问题

package myApp;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.swing.JFrame;

import App2.Applic2;

public class MYApp {

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static void main(String arg[]){
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setTitle("Application frame 1");
        f.setSize(200,200);
        f.setVisible(true);
        Class cls = Applic2.class;
        Object[] actuals = { new String[] { "" } };


        Method m = null;
        try {
            m=cls.getMethod("main", new Class[] { String[].class } );
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
            try {
                m.invoke(null,actuals);
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }

}

第二包

package App2;

import javax.swing.JFrame;

public class Applic2  {

    @SuppressWarnings("unused")
    public static void main(String args[]){

        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(200,200);
        f.setVisible(true);
        f.setTitle("This needs not to be changed");
        NewFrame3 Frame3 = new  NewFrame3();
    }

}

第二类 App2 包。

package App2;

import javax.swing.JFrame;

public class NewFrame3 {

    public NewFrame3(){

        JFrame f = new JFrame();
            f.setTitle("f3");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(200,200);
            f.setLocation(200, 200);
            f.setVisible(true);
    }

}

MYAPP 调用 Applic2 的实例,后者进一步调用 NewFrame3 的实例。就像我们可以看到,如果我关闭“NewFrame3”实例或 Applic2 实例,整个程序将关闭(由于 EXIT_ON_CLOSE)语句。

我想要一个解决方案,其中 MYAPP 不应在关闭 Applic2NewFrame3 时关闭。

我无法对 APPlic2 或 NewFrame3 进行任何更改。通过反射 如果我们尝试将 EXIT_ON_CLOSE 转换为 DISPOSE_ON_CLOSE 当我们没有扩展类时,我们如何访问这些框架及其 setDefaultCloseOperation() JFrame ?

在提到的另一个解决方案中,应该创建一个新的 JVM 实例,并且应该在这个新的 JVM 实例上的新进程中执行 Applic2 .但后来我遇到了 runtime.exec 将 Java 命令作为输入,而不是像 method.invoke() 这样的 Java 语句。

我可以通过加载 Applic2 的加载程序访问 Applic2 我只能访问内存中 Applic2 的类文件,所以我无法使用 jar 在 runtime.exec() 中运行。现在我该如何解决?

将这些语句添加到 MYApp 类可确保在单击框架的关闭按钮时不会发生任何事情,但事实并非如此

Frame[] f2 = JFrame.getFrames();

            for(Frame fx: f2){
                System.out.println(fx.getTitle());
                fx.addWindowListener(new WindowAdapter(){
                      public void windowClosing(WindowEvent we){


                      }
                      });

并且此代码需要添加到实例化的最后一帧,否则它会返回所有帧。即,如果将此框架添加到 JFrame3 类,则返回所有实例化的框架,如果添加到 MyApp,则返回 MyApp 中的 JFrame,如果添加 Applic2,则返回在 MYApp 和 Applic2 中实例化的框架。为什么会出现这种行为??

最佳答案

您可以使用 JFrame.getFrames() 返回一个 Frame 数组(您也可以使用 getWindows() 以获得更低的级别在当前应用程序上下文中创建的那些窗口的列表)。

然后,您需要遍历,检查每一帧以查看它是否符合您的要求。在那之后,您不需要反射,您可以直接访问框架

与其他 JVM 通信的唯一方法是通过套接字通信(例如 RMI)。

更新示例

Frame[] listOfFrames = JFrame.getFrames();
for (Frame : listOfFrames) {
  if (frame instanceof JFrame) {

      JFrame aFrame = (JFrame)frame;

  }
}

关于java - 在这种情况下,新的 JVM 实例或反射会有帮助吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11573259/

相关文章:

java - 如何在具有内存和时间限制的沙箱中运行不受信任的 Groovy 代码?

Java 编译器找不到我的 Scanner 变量

java - 如何使用java在空单元格上写入?

.net - 检查属性是否为 bool 类型

c# - 反射查找应用了 PostSharp 方面的所有方法

java - 限制 Eclipse 的 RAM 使用

java - Itext 错误 - "The method add(AreaBreak) in the type Document is not applicable for the arguments (PdfTable)"

java - Spring 4.X 设置 XML 响应的内容类型

go - 使用反射识别非内置类型

java - JVM是根据操作系统还是CPU架构来开发的?