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

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

微生昌勋
2023-03-14
问题内容

我发布的是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不应在关闭Applic2或时关闭的解决方案NewFrame3

我无法对APPlic2或NewFrame3进行任何更改。通过反射如果我们非要把EXIT_ON_CLOSEDISPOSE_ON_CLOSE我们如何使用这些框架和他们的setDefaultCloseOperation()时候我们没有我们的类扩展JFrames

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

我可以通过加载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中的JFrame,则返回所有实例化的帧;如果添加了Applic2,则返回在MYApp和Applic2中实例化的帧。为什么会这样?


问题答案:

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

然后,您需要遍历,检查每个框架是否符合您的要求。之后,您不需要反射,就可以直接访问框架

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

用示例更新

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

      JFrame aFrame = (JFrame)frame;

  }
}


 类似资料:
  • 在哪种情况下会发生这种情况?

  • 我在使用fs.readfile进行同步时遇到了一个问题,他们没有在第一次初始化,如果我再次尝试请求,那么我就有结果了。我知道我可以用promise和我从Kriskowal找到一些有用的东西。我试过但没有成功。我不太明白如何实施它。如果有人能帮忙,我将永远感激。 代码:

  • 我有以下项目结构: null 谢了。

  • 问题内容: 这可能是一个琐碎的问题,但阅读ARG和ENV的文档对我而言并不清楚。 我正在构建一个PHP-FPM容器,我想提供启用/禁用某些用户需求扩展的功能。 如果可以在Dockerfile中通过添加条件并在build命令上传递标志来做到这一点,那就太好了,但不支持AFAIK。 就我而言,我的个人方法是在容器启动时运行一个小的脚本,如下所示: 这是我的样子: 如果您需要深入了解我的工作方式,那么这

  • 根据Java教程 将包装类型(整数)的对象转换为其相应的基元(int)值称为取消装箱。当包装类的对象为: 作为参数传递给需要相应基元类型的值的方法 分配给相应基元类型的变量 为什么在这种情况下会发生拆箱? 在这种情况下,这些事情发生在哪里?是否有管理数组中元素访问的底层方法?或者[]暗示某种变量?

  • 这可能是一个微不足道的问题,但是阅读ARG和ENV的文档并没有让我明白。 我正在构建一个PHP-FPM容器,我希望能够根据用户需要启用/禁用一些扩展。 如果可以在Dockerfile中通过在构建命令上添加条件和传递标志来实现这一点,那就太好了,但是不支持AFAIK。 在我的情况下,我个人的方法是在容器启动时运行一个小脚本,如下所示: 这就是我的的样子: 目前这是工作,但。。。如果我想添加20个(随