如何查找JVM尝试加载的类的列表和顺序(而不是已加载的类)

时间:2012-06-27 14:13:38

标签: java jvm

我正在尝试调试Sun JVM正在尝试加载我调用的静态方法未使用的类的问题,这导致NoClassDefFoundError。详情如下:

方法A.x()调用B.getTZ_OFFSET(),即使在控件到达NoClassDefFoundError之前,它也会OraclePreparedStatement传入getTZ_OFFSET。我查看了B中的所有静态变量和块,但没有一个引用OraclePreparedStatement或与此密切相关的任何内容。我假设只是导入类不会导致类被加载。

如何根据JVM尝试加载OraclePreparedStatement找出依赖关系?

switch -verbose:class仅提供已成功加载的类列表,而不是JVM尝试加载的类。有没有办法获得这些信息?

任何帮助都将受到高度赞赏。

我知道导入ojdbc.jar导致问题消失,但我对根本原因更感兴趣,为什么它首先尝试加载它。

1 个答案:

答案 0 :(得分:1)

您的JVM找不到的类可能会在很多地方被引用:在您调用的方法的参数列表中,返回类型,您正在使用的类的类(静态)成员,任何超类的类成员和静态初始化器。您必须检查所有这些地方以找到隐藏的参考。 NoClassDefFoundError也可能掩盖了您获得的其他一些错误,例如创建的异常对象并引用不存在的类。

确定加载订单类的一种方法是实现自己的类加载器。您只需要扩展类ClassLoader并覆盖方法loadClass(String,boolean),从而可以打印出标准输出所请求的类的名称,然后委托给super.loadClass(String,boolean)。