【问题标题】:Attach to another JVM and listen for events? Possible?附加到另一个 JVM 并监听事件?可能的?
【发布时间】:2011-03-23 18:44:46
【问题描述】:

我正在尝试编写一个小型内部工具,用于调试 Swing 应用程序中的焦点问题。现在调试器工具内置在应用程序中,并通过调试命令行参数启用。

我想做的是拥有一个独立的 Java 应用程序,它可以连接到另一个 JVM 并监听某些事件(在本例中,是 KeyboardFocusManager 上的 PropertyChangeEvents)。

理想情况下,它应该能够在不对正在调试的应用程序进行任何更改的情况下执行此操作,因此可以“按需”使用它来调试任何 Swing 应用程序中的焦点问题。有点像 VisualVM 如何附加到任何正在运行的 VM。

这可能吗?有哪些起点? JMX?其他 IPC 机制?

【问题讨论】:

    标签: java debugging swing ipc listener


    【解决方案1】:

    您可以使用 java 平台调试器架构 (JPDA)

    http://download.oracle.com/javase/6/docs/technotes/guides/jpda/examples.html

    【讨论】:

    • 这正是我所需要的。向 KeyboardFocusManager.focusOwner 添加了一个 ModificationWatchpointEvent,它就像一个魅力。谢谢!
    【解决方案2】:

    不确定这是否涵盖了它,但是.. 假设应用程序是使用这些标志启动的:

    -Xdebug -Xrunjdwp:transport=dt_socket,address=8001,server=y,suspend=n
    

    您可以使用 Eclipse 远程将调试器附加到进程。

    【讨论】:

    • 对,但我想要一个独立的应用程序,它基本上可以通知您所有焦点更改事件。是否可以使用调试 API 以编程方式执行此操作?
    • 焦点改变事件是程序化的,这就是为什么你必须让监听器对它们做出反应,JVM 不能神奇地对它一无所知的东西做出反应。
    • 啊。 JDI(Java 调试接口)中的 MethodEntryRequest 类就是这样做的。基本上流程是您附加到流程,获取 EventRequestManager 的实例,在那里注册您的方法输入请求并启用它。不过,您仍然需要我在上面发布的那些调试标志。
    • 对上述的响应 - 假设主机操作系统通知进程有关焦点更改事件,它们一旦进入应用程序就可以被拦截。
    • @Jarrod:您可以通过向 KeyboardFocusManager 添加 PropertyChangeListener 来监听所有焦点更改:KeyboardFocusManager.getCurrentKeyboardFocusManager().addPropertyChangeListener("focusOwner", new PropertyChangeListener(...));
    猜你喜欢
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    相关资源
    最近更新 更多