tabla studio programacion móviles ejemplos desarrollo curso compilador codigo aplicaciones java compilation code-translation

studio - Transformación de código Java en tiempo de compilación



programacion android pdf 2018 (3)

Me gustaría transformar el código fuente de Java en tiempo de compilación justo antes de pasar el código fuente al compilador. En otras palabras, me gustaría crear un preprocesador capaz de transformar

"bla bla bla"

en cualquier otro código como:

new MyClass("bla", 3)

Mi motivación real es hacer el cifrado de cadenas, como se explica aquí

Algunas personas sugieren escribir procesadores de anotaciones personalizados, pero hasta donde entiendo las anotaciones:

  • se pueden usar para generar un nuevo archivo de clase, pero no para transformar el código existente antes de pasarlo al compilador
  • parece que funcionan a nivel de paquete, clase o método, pero no del cuerpo / implementación del método.

Algunas personas sugieren usar marcos como Spoon u ObjectsWeb ASM, pero estos marcos parecen complicados de aprender y desplegar en una base de código existente.

Me gusta encontrar un ejemplo simple de preprocesamiento de código Java para ambos enfoques.

¿Alguien ve alguna forma inteligente de hacer la transformación de código sin cambiar completamente una base de código grande existente con múltiples módulos de hiedra? Las anotaciones parecen ser la mejor manera, pero no entiendo cómo hacerlo.


Creo que podrías probar la misma técnica usada en el Proyecto Lombok.

Se explica aproximadamente por los autores en esta entrevista :

¿Qué está pasando bajo el capó? Es decir, ¿cómo resulta una anotación en la repetición que termina en el bytecode?

Reinier : la API del procesador de anotaciones solo le permite crear nuevos archivos, no le permite modificar el archivo que tiene la anotación en su interior. Que es lo que hace Lombok, por lo que Lombok no usa la API del procesador de anotaciones.

En su lugar, Lombok utiliza la API del procesador de anotaciones solo como un mecanismo para insertarse en el proceso de compilación. Todos los procesadores de anotación se inicializan al principio del proceso de compilación, y Lombok modifica javac cuando se inicializa como un procesador de anotación. Solo cambiamos una cosa: el AST (el código fuente sin procesar, analizado en forma de árbol) se entrega primero a Lombok, que genera todo lo que se necesita generar, antes de que continúe javac.

y en ¿Cómo funciona lombok?

También es posible extender el Proyecto Lombok a sus necesidades.


Hay alguien que ya escribió un pequeño plugin de hormiga preprocesador tipo C en python / jython. Puedes encontrarlo here . Tenga en cuenta que nunca lo he usado, pero quizás pueda ser un buen punto de partida para sus necesidades.

También hay un complemento de java-comment-preprocessor (estilo similar) en el código de Google que también podría ser un punto de partida útil.

Buena suerte. Suena como un reto divertido. Por supuesto, tenga en cuenta que la ofuscación solo hace que sea un poco más difícil extraer la cadena, pero aún así no es imposible. Si realmente quiere hacerlo mucho más difícil, entonces podría considerar encriptar sus cadenas y / o usar AOP.


Si el preprocesador de C sería suficiente, conseguí que funcionara con Eclipse en Windows. Aunque solo funciona en Juno.

https://.com/a/10497206/1137626