2016-04-02 4 views
4

Javaコンパイラが異なるファイルの別のクラスへの参照を解決するには、クラスパス上にある必要があります。Javaクラスローダーはメソッド本体を検証しますか?

クラスパスにクラスが見つからないか、メソッドのシグネチャが一致しない場合、いくつかの例外がスローされます。

しかし、メソッドの実装に関して、コンパイル時のクラスパスと実行時のクラスパスを比較する検証はありますか?

どうすればいいですか?コンパイル時に異なるものに実装されたメソッドシグネチャをclasspathに指定するとどうなりますか?

には検証エラーまたはいずれかの例外はありませんスローされますか?それは非常に安全ではないようです。

+3

いいえ。 APIが変更されない限り、実行時に実装をスワップできます。たとえば、マイナーリリース間でlog4jをアップグレードしても、アプリケーションを再コンパイルする必要はありません。 –

+1

さて、彼らは同じパッケージに入っている必要がありますが、あなたはそれらを置き換えることができます。あなたはそれを機能として見ることができます。 classpathに指定されている順番でクラスがロードされている(または少なくとも古いバージョンのJavaである)ので、バグの実装を置き換えるためにこれを使用しました。また、ライブラリのアップグレードもサポートしています。 – KevinO

+0

それは強力なもののようですが、非常に危険です。あなたはサーバー上の誰かのクラスファイルを変更することができ、彼はそれをまったく気付かないでしょう:D。 – user3364192

答えて

5

一般的に言えば、シグネチャが一致する限り、実行時にメソッドを置き換えることができます(いくつかの追加の制約をモジュロにする)。

もちろん、カスタムクラスローダーの実装では、ハッシュ/署名の検査などの拡張検証を実行できます。

JVMの機能validate is the standards-conformance of the bytecode。私。バイトコードは存在しないスタックスロットを参照することはできず、JVM内で不正な動作につながる任意のジャンプや同様のことを行うことはできません。

関連する問題