我正在尝试调试Sun JVM正在尝试加载我调用的静态方法未使用的类的问题,这导致NoClassDefFoundError
。详情如下:
方法A.x()
调用B.getTZ_OFFSET()
,即使在控件到达NoClassDefFoundError
之前,它也会OraclePreparedStatement
传入getTZ_OFFSET
。我查看了B
中的所有静态变量和块,但没有一个引用OraclePreparedStatement
或与此密切相关的任何内容。我假设只是导入类不会导致类被加载。
如何根据JVM尝试加载OraclePreparedStatement
找出依赖关系?
switch -verbose:class
仅提供已成功加载的类列表,而不是JVM尝试加载的类。有没有办法获得这些信息?
任何帮助都将受到高度赞赏。
我知道导入ojdbc.jar导致问题消失,但我对根本原因更感兴趣,为什么它首先尝试加载它。
答案 0 :(得分:1)
您的JVM找不到的类可能会在很多地方被引用:在您调用的方法的参数列表中,返回类型,您正在使用的类的类(静态)成员,任何超类的类成员和静态初始化器。您必须检查所有这些地方以找到隐藏的参考。 NoClassDefFoundError也可能掩盖了您获得的其他一些错误,例如创建的异常对象并引用不存在的类。
确定加载订单类的一种方法是实现自己的类加载器。您只需要扩展类ClassLoader并覆盖方法loadClass(String,boolean),从而可以打印出标准输出所请求的类的名称,然后委托给super.loadClass(String,boolean)。