# data[].attributes.body
En esta etapa se obtiene el código fuente, escribiendo en un editor, que puede o no formar parte del programa compilador. A continuación, se guarda en algún dispositivo de almacenamiento para su uso en la siguiente etapa.
El archivo que contiene el código fuente de un programa en java tendrá la extensión .java.

# data[].attributes.body
En esta fase se traduce el código fuente obtenido en la fase anterior a código máquina. Si no se produce ningún error se obtiene el código objeto.
En caso de errores el compilador los mostraría para ayudarnos a corregirlos y se procedería a su compilación de nuevo, una vez corregidos.

# data[].attributes.body
Cuando se ejecuta el programa en java con el comando java, entra en juego un componente llamado cargador de clases. Este, carga las clases dinámicamente en la JVM.  Lo primero que hará el cargador de clases es intentar cargar nuestro .class en memoria e ir cargando todos los .class a los que la aplicación haga referencia. Las clases a las que la aplicación haga referencia pueden encontrarse localmente en el disco duro.

# data[].attributes.body
Con el fin de asegurar que no se violan restricciones de seguridad a medida que se van cargando las clases en memoria, en la verificación se examina los bytecodes para asegurar que sean válidos.
Se realizan pruebas tales como que el formato del fragmento de código sea el correcto, que no se forjen punteros, que no haya violaciones de acceso a la memoria y que los objetos sean accedidos por lo que son.

# data[].attributes.body
En esta última fase es donde la JVM ejecuta las acciones especificadas por los bytecodes cargados en su memoria.
Los archivos .class se cargan en la memoria virtual  y es la máquina virtual (JVM) la que se encarga de traducir estas instrucciones que ella puede entender a instrucciones que entiende el Sistema Operativo y hardware subyacente.