私はJavaの設計哲学を読んでいて、この行に私は感銘を受けました:「VMはJava =コードは有効であり、コードの変更が検出された場合の解釈を拒否します。 "VMは、バイトコードが変更されていないことをどのように確認しますか?
Javaバイトコードクラスファイル形式は、メソッドシグネチャをキャプチャしますboth呼び出し元および呼び出し先(つまり、メソッド定義)。
したがって、2つのシグネチャを比較でき、不一致が検出された場合、一方は他方の期待が異なるようにコンパイルされましたが、もう有効ではありません。
バイトコード形式の他の機能により、言及されている署名も、少なくとも構文的には正しく使用されていることが保証されます。たとえば、適切な数のパラメーターが呼び出し元によって渡されていること、および呼び出し先の実装がそれらのパラメーターを正確に期待し、それ以上は期待していないことなどです。 (もちろん、これはすべての可能なバグを防ぐのではなく、特定のクラスの問題だけを防ぎます。)
バイトコード形式のこのプロパティは、他の一部のバイナリ実行可能形式にはありません(またはオプション)。
ただし、一部の言語は異なるメカニズムを提供します。たとえば、C++では Name Mangling を使用して、正しいシグネチャを持つ正しいメソッドが呼び出されるようにしています。これは、呼び出しサイトとメソッド定義の両方でメソッドシグネチャをキャプチャする形式です。
コード署名証明書 を利用します。
または単純化すると、基本的にファイルにチェックサムが追加され、そのチェックサムをだれが作成したかに関するいくつかの詳細情報が追加されます。操作を防止または少なくとも検出する(たとえば、チェックサムを置き換える)ことは、それよりも少し複雑ですが、用語がわかったので、オンラインまたはドキュメントでそのほとんどを検索できると思います。