Сами Oracle имеют небольшую страницу с фрагментами о том, как это работает здесь .
По сути, JRE не доверяет JDK. Это потому, что он не знает, какой компилятор JDK создал файл класса. Он обрабатывает файл класса как враждебный, пока не будет проверен.
Более того, проверка байт-кода является необходимым шагом для защиты от того, что Sun называет «враждебным компилятором». Собственный Java-компилятор Sun гарантирует, что исходный код Java не нарушает правила безопасности, но когда приложение импортирует фрагмент кода, оно фактически не знает , если фрагмент кода следует правилам языка Java для безопасности. Другими словами, код, возможно, не был создан заслуживающим доверия компилятором Java.
В этом случае система времени выполнения Java на вашем компьютере должна предположить, что фрагмент поврежден и подвергнуть его проверке байт-кода.
Виртуальная машина Java даже не видит байт-код, пока не пройдет этот процесс проверки. Выполнение этого при загрузке байт-кода также имеет то преимущество, что при каждом выполнении кода не нужно выполнять много проверок во время выполнения. Поскольку он был проверен на правильность, после запуска он может работать быстрее, чем это было бы возможно в противном случае.
Представление связанной схемы приведено ниже:
<<<=== Unsafe / Safe ===>>>
\
+---------------+ +-------------------+
| Java source | +--> | Class loader | --+
+---------------+ | | Bytecode verifier | |
| | +-------------------+ |
V | / |
+---------------+ | \ V
| Java compiler | Network / +-------------------+
+---------------+ | \ | JVM/JIT |
| | / +-------------------+
V | \ |
+---------------+ | / V
| Java bytecode | --+ \ +-------------------+
+---------------+ / | Operating system |
\ +-------------------+
/ |
\ V
/ +-------------------+
\ | Hardware |
/ +-------------------+
\
<<<=== Unsafe / Safe ===>>>