Will new instance of JVM or reflection help in this case

偶尔善良 提交于 2019-12-01 08:43:20

You could use JFrame.getFrames() which returns an array of Frame (you could also getWindows() for a much lower level list of those windows created within the current application context).

Then, you need to walk through, checking each frame to see if it meets your requirements. After, that, you don't need reflection, you gain direct access to the frames

The only only way to communicate with other JVM's is via socket comms (such as RMI).

UPDATE WITH EXAMPLE

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

      JFrame aFrame = (JFrame)frame;

  }
}
MadProgrammer

Cross Process Communications is not a simple thing. Basically, each process you want to talk to needs to have a ServerSocket with which it can accept incoming requests. If you want to perform two way communication, each process would need to have it's own ServerSocket, this will allow ANY process to start the communications.

This raises issues with port numbers and the like, but you could actually do a muticast to over come that (basically, "hay everybody, I'm here, come talk to me") which could be used to determine who's available or not - take a look at Broadcasting to Multiple Recipients for an example.

So. When you're ready, you would open a socket connection to the process in question (localhost/127.0.0.1) on it's port and start chatting.

Now. The problem I see with what you've described, is the fact that in order to get this to run, you're going to need some kind of launcher that can create the server socket and then execute the existing program (as you've already described), which raises the question of why? If you're only goal is to get these frames to stop closing your application, simply launching the program in a new JVM achieves that goal. Obviously, if you still need more information from them, then that's a reasonable excuse for all the hard work.

Now, the good news, you can serialize objects across sockets (that is, you can send Java objects via the socket connection), check Discover the secrets of the Java Serialization API for more info.

Now, if that hasn't scared you off, check out All About Sockets for more information.

And finally, the big question of "how" to execute a new JVM, check out Java ProcessBuilder, it actually describes a means by which you can execute a new JVM!!

So have completed the solution with the help provided by MadProgrammer amd mKorbel and here is the updated MYApp class

package myApp;

import java.awt.Frame;
import java.awt.Window;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
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 } );


            Method[] m1  =Frame.class.getDeclaredMethods();







        } 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();
            }


            Frame[] f2 = JFrame.getFrames();
            //  Window[] f23=  JFrame.getFrames();

                for(Frame fx: f2){
                    System.out.println(fx.getTitle());
                    //  fx.setVisible(false);

                      if (fx instanceof JFrame) {

                          JFrame aFrame = (JFrame)fx;
                          aFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

                      }
                    }

    }

}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!