2012-05-07 20 views
25

Me gustaría transformar 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 transformarTransformación de código Java en tiempo de compilación

"bla bla bla" 

en cualquier otro código, tales como:

new MyClass("bla", 3) 

Mi motivación real es para cifrar la cadena, como explained here

Algunas personas sugieren escribir procesadores de anotación personalizados, pero por lo que entiendo las anotaciones:

  • se pueden utilizar para generar un nuevo archivo de clase, pero no para transformar el código existente antes de pasarlo al compilador
  • parecen funcionar en el paquete, clase o nivel de método, pero no en el cuerpo del método/implementación.

Algunas personas sugieren el uso de marcos como una cuchara o ObjectsWeb ASM, pero estos marcos parecen complicados de aprender y desplegar sobre 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 del código, sin cambiar por completo 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.

+0

[Jet] (http://www.eclipse.org/articles/Article-JET/jet_tutorial1.html) podría ser útil (no sé en que estado se encuentra, pero funcionó bien algunos hace años que). JavaCC sigue el mismo enfoque. – home

+3

Puede escribir un plugin Ant/Mavin personalizado que primero haría el cifrado y luego compilaría su código. – Pushkar

+0

Tengo la misma pregunta. ¿Puedes compartir con lo que terminaste? – rahulmohan

Respuesta

1

Hay alguien que ya escribió un pequeño plugin preprocesador de tipo C en python/jython. Puede 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 maven 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 desafío divertido. Por supuesto, tenga en cuenta que la ofuscación simplemente hace que sea un poco más difícil extraer la cuerda, pero aún así no es imposible. Si realmente quiere hacerlo significativamente más difícil, entonces puede que quiera ver encriptar sus cadenas y/o usar AOP.

9

Creo que se podría tratar de la misma técnica utilizada en Project Lombok

Está aproximadamente explicado por los autores en this interview:

lo que está pasando bajo el capó? Es decir, ¿cómo resulta una anotación en el texto repetitivo que termina en el bytecode?

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

En cambio, 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 transfiere primero a Lombok, que genera todo lo que se debe generar, antes de que javac continúe.

y en How does lombok work?

También es posible extender Proyecto Lombok a sus necesidades

Cuestiones relacionadas