Java JDI CommandLineLaunch не загружает требуемый класс

В настоящее время я изучаю JDI в Java и пытаюсь запустить виртуальную машину, на которой запущена нужная мне программа, и установить соединение с запущенной виртуальной машиной, на которой запущена нужная программа.

Для этого я использую соединитель Launching ("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 находится в том же каталоге, что и класс, в котором находится приведенный выше код.

Кто-нибудь знает, в чем проблема?

1 ответ

Решение

Первоначально класс Main не загружается из-за приостановки работы виртуальной машины непосредственно перед ее загрузкой.

Чтобы получать уведомления о загрузке классов, вам нужно создать ClassPrepareRequest и включить его. Затем обработайте запущенную виртуальную машину EventQueue по мере поступления событий. Некоторые события приводят к приостановке работы виртуальной машины, поэтому после этого необходимо вызвать 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()
             }
}
Другие вопросы по тегам