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 は、発生する他のエラー (たとえば、作成されて存在しないクラスを参照する例外オブジェクト) をマスクしている可能性もあります。

クラスがロードされる順序を決定する 1 つの方法は、独自のクラス ローダーを実装することです。クラス ClassLoader を拡張し、メソッド loadClass(String, boolean) をオーバーライドするだけで済みます。これにより、要求されているクラスの名前を標準出力に出力してから、super.loadClass(String, boolean) に委任できます。

于 2012-06-27T14:27:38.680 に答える