使用Java调试接口手动加载类

时间:2015-02-25 11:24:37

标签: java jdi

背景

我正在创建一个将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.");
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我知道它已经晚了3个月。

提供要加载的类的包目标。您需要访问要转换的javacode的类路径。

查看此帖子以查找包中的类。 Can you find all classes in a package using reflection?

然后只需要使用Class.forName

将类加载到类加载器中

如果您仍需要课程准备活动。那也应该被触发。