0

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

方法A.x()调用B.getTZ_OFFSET(),它甚至在控件到达之前就遇到NoClassDefFoundError了。我查看了其中的所有静态变量和块,它们都没有引用或任何与之密切相关的东西。我假设仅仅导入类不会导致类被加载。OraclePreparedStatementgetTZ_OFFSETBOraclePreparedStatement

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

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

任何帮助将不胜感激。

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

4

1 回答 1

1

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

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

于 2012-06-27T14:27:38.680 回答