Sí, los archivos de clase Java son fáciles de aplicar ingeniería inversa. El formato es muy regular y muy limitado: la máquina virtual debe poder verificar que el código cumple con las reglas de tipificación de código de Java. Esto es como la salida de un compilador de C con todas las optimizaciones desactivadas: la estructura del programa es claramente visible. (En el modelo Java, la optimización ocurre en la propia VM, cuando se ejecuta el compilador JIT).
Sin embargo, la gente trata de ofuscación; p.ej. con ProGuard (hay muchas herramientas en ese mercado; esta es gratuita y de código abierto). Por ejemplo, todas las clases y métodos se renombran con cadenas que no tienen sentido para un ser humano (pero la ofuscación también produce un archivo de traducción que el desarrollador guarda para sí mismo, de modo que pueda interpretar los rastreos de la pila en caso de informes de errores). / p>
De forma alternativa, puede procesar su código Java en un compilador de tiempo de anticipación , como JET . Esto tiene algunas restricciones (en particular, el resultado ya no es "portátil", ya que es un código nativo) pero hace que la descompilación sea más difícil (cerca de la complejidad de la ingeniería inversa compilada C o C ++).
Como regla general, la ingeniería inversa tiende a funcionar, y para Java aún más, incluso después de la ofuscación. Es mejor que no utilices la ofuscación como la base de tu seguridad.
También vale la pena señalar que esto es muy similar a los problemas de lectura de códigos en cualquier lenguaje .Net como C #. Es bastante trivial generar código Java, VB.Net o C # a partir de los archivos distribuidos y las técnicas de ofuscación que intentan dificultar la lectura también son similares para ambos.