0

我目前正在学习 Java 的 JDI,我正在尝试启动一个正在运行我想要的程序的虚拟机,并建立与正在运行所需程序的已启动 VM 的连接。

为此,我使用了启动连接器(“com.sun.jdi.CommandLineLaunch”)。

我给启动连接器以下参数:

        LaunchingConnector connector = findConnecter();
        Map args = connector.defaultArguments();

        //Main Arguments
        Connector.Argument mainArgs = (Connector.Argument)args.get("main");
        mainArgs.setValue("Main2");

        //Options Arguments
        Connector.Argument options = (Connector.Argument)args.get("options");
        options.setValue("-cp .");

然后使用 启动连接器VirtualMachine vm = connector.launch(args);。但是,当我打印出使用以下代码片段加载的类列表时:

            List<ReferenceType> classes = vm.allClasses();
            for (int i = 0; i<classes.size(); i++){
                System.out.println(classes.get(i).name());
            }

Main2 类不在列表中。

我猜这是一个类路径问题,但无法让它工作。Main2.class 文件与上述代码所在的类位于同一目录中。

有谁知道是什么问题?

4

1 回答 1

0

Main 类最初未加载,因为 VM 在加载之前暂停。

为了获得加载类的通知,您需要创建“ClassPrepareRequest”并启用它。然后在事件到达时处理启动的 VM 的“EventQueue”。某些事件会导致 VM 挂起,因此必须在之后调用 vm.resume()。

示例处理:

while (true) {
    //Waits forever for the next available event. Pauses here until something is available.
             EventSet eventSet = eventQ.remove();
             for(Event event: eventSet){
                       if(event instanceof ClassPrepareEvent){
                            ClassPrepareEvent classPrepareEvent = (ClassPrepareEvent)event;
                            ReferenceType refType = classPrepareEvent.referenceType();
                            System.out.println("---"+refType.name() + " loaded.");
                        }
               vm.resume()
             }
}
于 2014-07-01T21:56:51.100 回答