我正在尝试调试以下问题:Sun JVM 尝试加载我调用的静态方法未使用的类,并导致 NoClassDefFoundError
。详情如下:
方法 A.x()
调用 B.getTZ_OFFSET()
并且它甚至在 OraclePreparedStatement
之前就遇到了 NoClassDefFoundError
控件到达getTZ_OFFSET
。我查看了 B 中的所有静态变量和 block ,没有一个引用 OraclePreparedStatement 或与之密切相关的任何内容。我假设仅导入该类不会导致该类被加载。
如何根据哪个 JVM 尝试加载 OraclePreparedStatement
找出依赖关系?
开关-verbose:class
仅给出已成功加载的类的列表,而不是JVM尝试加载的类的列表。有没有办法获取该信息?
任何帮助将不胜感激。
我知道导入 ojdbc.jar 会导致问题消失,但我对根本原因更感兴趣,比如为什么它首先尝试加载它。
最佳答案
您的 JVM 找不到的类可能在许多地方被引用:您调用的方法的参数列表、返回类型、您正在使用的类的类(静态)成员、任何父类(super class)的类成员以及静态初始化器。您必须检查所有这些地方才能找到隐藏的引用。 NoClassDefFoundError 还可能掩盖您收到的其他一些错误,例如创建并引用不存在的类的异常对象。
确定类加载顺序的一种方法是实现您自己的类加载器。您只需要扩展类 ClassLoader 并重写方法 loadClass(String, boolean),即可打印到标准输出所请求的类的名称,然后委托(delegate)给 super.loadClass(String, boolean)。
关于java - 如何查找 JVM 尝试加载的类的列表和顺序(而不是已经加载的类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11228228/