背景
我正在创建一个将Java代码转换为UML类图的工具。由于我只有3周的时间,我的老师建议我使用Java调试接口而不是创建解析器来完成这项任务。
问题
我已经注册了ClassPrepareEvents,它显示了VM加载类的时间(参见下面的代码片段),但是只在需要时才加载类。例如,如果单击GUI中的按钮创建A类型的对象,则在用户单击按钮之前不会加载A.
这需要是一个自动化工具,因此需要在没有用户交互的情况下加载程序中的所有类,那么如何手动加载所有这些类呢?或者我错过了API中的某些内容,还有另一种方法吗?
提前致谢! :)
代码段
EventRequestManager em=vm.eventRequestManager();
ClassPrepareRequest cpR = em.createClassPrepareRequest();
cpR.addClassFilter("project.*");
cpR.enable();
EventQueue eventQ=vm.eventQueue();
while (true) {
EventSet eventSet=null;
try {
eventSet=eventQ.remove();
} catch (Exception e) { // handle the error
continue;
}
EventIterator eventIterator=eventSet.eventIterator();
while (eventIterator.hasNext()) {
Event event=eventIterator.nextEvent();
if(event instanceof ClassPrepareEvent) {
ClassPrepareEvent classPrepareEvent = (ClassPrepareEvent)event;
ReferenceType refType = classPrepareEvent.referenceType();
System.out.println(refType.name() + " loaded.");
}
}
}
答案 0 :(得分:1)
我知道它已经晚了3个月。
提供要加载的类的包目标。您需要访问要转换的javacode的类路径。
查看此帖子以查找包中的类。 Can you find all classes in a package using reflection?
然后只需要使用Class.forName
将类加载到类加载器中如果您仍需要课程准备活动。那也应该被触发。