2008-10-02 15 views
12

Estoy trabajando en un proyecto en el que realizamos una gran cantidad de transferencias de objetos remotos entre un servicio Java y clientes escritos en otros varios idiomas. Dadas nuestras limitaciones actuales, he decidido ver qué se necesitaría para generar código basado en una clase Java existente. Básicamente necesito tomar un archivo .class (o una colección de ellos) analizar el bytecode para determinar todos los miembros de los datos y quizás getters/setters y luego escribir algo que pueda dar salida al código en un idioma diferente para crear una clase con la misma estructura .Inspeccionar mediante programación archivos .class

No estoy buscando decompiladores estándar como JAD. Necesito poder tomar un archivo .class y crear un modelo de objeto de sus miembros y métodos de datos. ¿Es esto posible?

Respuesta

12

He usado BCEL y me resulta bastante incómodo. ASM es mucho mejor. Utiliza mucho los visitantes (lo que puede ser un poco confuso) y no crea un modelo de objetos. No crear un modelo de objeto resulta ser una ventaja, ya que es poco probable que cualquier modelo que desee crear parezca una interpretación literal de todos los datos.

+2

+1 para ASM sobre BCEL. Mucho mejor API. – skaffman

+1

En realidad, ASM proporciona un modelo de objetos si lo desea. Ver su Tree API. –

+0

Después de evaluar todas las opciones enumeradas aquí hasta el momento, ASM es definitivamente el mejor en mi humilde opinión para la inspección de archivos .class. Estoy de acuerdo en que el patrón de visitante es mucho más limpio que el modelo de BCEL. Gracias por el consejo. –

1

He usado BCEL en el pasado y era bastante fácil de usar. Fue hace unos años, así que puede haber algo mejor ahora.

Apache Jakarta BCEL

+0

Wow, en realidad me ganaste a responder mi propia pregunta. Esa fue mi elección predeterminada, iba a hacer una pregunta y responderla yo mismo y ver si alguien más tenía mejores ideas. Gracias. –

0

creo javassist puede ayudar a usted también.

http://www.jboss.org/javassist/

nunca he tenido la necesidad de usarlo, pero si se le da una oportunidad, habría que hacernos llegar sus comentarios al respecto?

Aunque creo que es más para la manipulación de bytecode que para la inspección de clase.

1

De su descripción, suena como simple reflection sería suficiente. Puede descubrir toda la estructura estática de la clase, así como acceder a los campos de una instancia particular.

Solo cambiaría a BCEL si está tratando de traducir las instrucciones del método. (Y si eso es lo que intenta automatizar, ¡buena suerte!)

+0

La reflexión como una posible solución, es menos que ideal. Quiero poder apuntar a un archivo .class arbitrario y deconstruirlo. Si tuviera que usar el reflejo, tendría que hacer que el cargador de clases cargue la clase antes de comenzar a trabajar con él. –

1

JAD es un descompilador de Java que no permite el acceso programático. Ya no está disponible, y probablemente no funcionará para proyectos más nuevos con bytecodes Java7.

+0

JAD es un descompilador, necesito algo que funcione programáticamente. –

+0

FYI, este enlace está muerto ... – hichris123

+0

Se corrigió este enlace, se agregó más texto. –

1

Estoy sorprendido de que nadie haya mencionado ASM todavía. Es la mejor biblioteca de códigos de bytes que puede comprar tu dinero. Bueno, vale, es gratis.

Cuestiones relacionadas