Estoy buscando una biblioteca de manipulación de bytecode Java bien mantenida con una API intuitiva. Parece que hay muchos de ellos por ahí. ¿Alguna sugerencia sobre cuáles probar?Java Bytecode Manipulation Library Sugerencias
Respuesta
La mejor respuesta a su pregunta se regirá por sus necesidades y objetivos específicos; si puede ampliar lo que está tratando de lograr, quizás pueda ofrecer una respuesta más personalizada.
En lugar de eso, sin embargo, en mi experiencia, ASM ofrece probablemente la mejor combinación de madurez, flexibilidad y facilidad de uso:
- Es en fase de desarrollo relativamente activa: a pesar de que la última versión es de junio de 2009, los desarrolladores hacen compromisos regularmente con sus VCS.
- Ya se usa ampliamente en varios productos destacados de Java, como AspectJ, Groovy, Cobertura y muchos otros, lo que promete una amplia base de usuarios y, por lo tanto, una amplia comunidad de soporte.
- Está bastante documentado, y hay una serie de tutoriales, guías de usuario y documentos de referencia disponibles tanto del OW2 Consortium como de la comunidad en general.
N.B. El comentario @Yuri a continuación describe una situación que personalmente aún no he encontrado, pero que puede representar un obstáculo significativo. Tenga en cuenta su observación/experiencia al evaluar las diversas bibliotecas de manipulación de códigos de bytes.
Eso realmente depende de cómo se defina intuitiva ;-) empecé a usar hace ASM dos semanas para que una determinada tarea en mi proyecto actual y funcionó como un encanto. Solo me llevó un par de horas entenderlo y poder usarlo, pero no llamaría intuitivamente a la API. Pero si conoce un poco sobre bytecode de Java y está familiarizado con el patrón de visitante, la curva de aprendizaje no es muy alta, IMO.
Otra ventaja de ASM es que aparentemente se incluye con la API estándar al menos en Sun JDK, aunque en un paquete diferente (com.sun.xml.internal.ws.org.objectweb.asm y subpaquetes).
Tiene razón: a juzgar por algunas de las API raras, las definiciones de intuitivo parecen diferir ampliamente;). ¡Acabo de pasar un poco de tiempo mirando a ASM, y estoy mucho menos intimidado de lo que esperaba! Creo que me quedaré con eso. Gracias por tu respuesta. – Daniel
No utilice paquetes de implementación ... –
Sí, claro, no use paquetes de implementación. Y tampoco manipules bytecode, a menos que realmente tengas que hacerlo ;-) –
Tome un vistazo a este artículo: http://www.pabrantes.net/blog/space/start/2008-03-24/1
Un poco viejo, pero sigue siendo relevante.
ASM y Javassist son los más utilizados ahora. Bcel está muriendo.
- 1. Query String Manipulation en Java
- 2. java bytecode editor?
- 3. Programming in Java bytecode
- 4. PDF Form Field Manipulation
- 5. ¿Es posible transformar el bytecode LLVM en bytecode de Java?
- 6. ejecutando bytecode jython usando java
- 7. Java: nueva instancia de bytecode
- 8. Especificación de bytecode de Java
- 9. Comportamiento diferente de bytecode java
- 10. Compilar con bytecode de java (sin usar Java)
- 11. Java Graphics library
- 12. Logger for Java library
- 13. Java SFTP Transfer Library
- 14. BSON library for java?
- 15. Java HTTP Server Library
- 16. Java CVS library
- 17. Java Clustering Library
- 18. java gis library
- 19. Java CSS spriting library
- 20. Java BBCode library
- 21. Perl array manipulation
- 22. Mathematica Dynamic List Manipulation
- 23. Powerbuilder Dynamic Array Manipulation
- 24. C++ Image Manipulation
- 25. PyBrain neuron manipulation
- 26. Optimización del compilador: bytecode de Java
- 27. Java bytecode equivalentes para ilasm/ildasm
- 28. Optimizaciones Java: solo bytecode contra JIT
- 29. Eliminando instrucciones del bytecode de Java
- 30. Software Synth Library para Java
Disculpa por la falta de detalles en la pregunta. Preferiría no dar los detalles de lo que estoy haciendo, pero tu respuesta fue bastante útil. Gracias. Creo que terminaré usando ASM. – Daniel
Al mirar esta respuesta, probé ASM y (4.0) tiene un error o un comportamiento realmente extraño. Estoy usando Tree API e iterando sobre las instrucciones del método InsnList. Ahora, la primera iteración da un resultado y otra iteración idéntica después de la primera da otro resultado: una instrucción se duplica y se coloca en la parte superior de la lista. Sin código de modificación, solo dos iteraciones, una por una. Cambiando a Javassist. –
@YuriUshakov: Esa no es una situación que haya experimentado personalmente. ¡Gracias por el aviso! – RTBarnard