Java JDI CommandLineLaunch未加载所需的类
我目前正在学习Java的JDI,我正在尝试启动一个运行所需程序的虚拟机,并与运行所需程序的已启动VM建立连接 为此,我使用了一个启动连接器(“com.sun.jdi.CommandLineLaunch”) 我为启动连接器提供以下参数:Java JDI CommandLineLaunch未加载所需的类,java,debugging,jdi,Java,Debugging,Jdi,我目前正在学习Java的JDI,我正在尝试启动一个运行所需程序的虚拟机,并与运行所需程序的已启动VM建立连接 为此,我使用了一个启动连接器(“com.sun.jdi.CommandLineLaunch”) 我为启动连接器提供以下参数: LaunchingConnector connector = findConnecter(); Map args = connector.defaultArguments(); //Main Arguments
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());
}
List classes=vm.allClasses();
对于(int i=0;i主类最初没有加载,因为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()
}
}