He estado usando Javassist para manipular dinámicamente las clases a medida que se cargan. Si bien agregar código a un método es relativamente fácil usando Javassist, no he podido encontrar una forma de eliminar el código .Eliminando instrucciones del bytecode de Java
En este momento estoy simulando la eliminación del código mediante el uso de nop instrucciones para reemplazar los códigos de operación específicos y los parámetros. Sin embargo, considero que esto sea sobre todo un truco:
Cada código de operación tiene que ser tratado por separado, ya que la longitud de bytes de los parámetros es diferente. En algunos casos, también tengo que elegir entre nop y pop, dependiendo de si el código de operación eliminado afecta a la pila o no. Este tipo de manipulación está empezando a ser tediosa, y el código que lo hace se está volviendo intrincado. Entonces, naturalmente, estoy esperando una solución existente.
El resultado final se rellena con nop instrucciones. Si bien la JVM debería optimizarlos sin impacto en el rendimiento, el bytecode resultante sigue siendo bastante poco elegante y más grande de lo que debería ser. Esto es más un problema de estética, pero todavía es algo a considerar.
Desafortunadamente, partes meramente cambiantes de la matriz de código de bytes para cerrar la brecha no es suficiente - las referencias al código movido (por ejemplo índices de instrucción de ramificación) deben ser actualizados también.
¿Es posible eliminar instrucciones usando Javassist? Alternativamente, ¿existe una biblioteca de manipulación de códigos de bytes que me permita hacerlo fácilmente, sin tener que analizar el bytecode?
Solo tengo curiosidad. ¿Por qué quieres hacer esto? ¿No sería más fácil descompilar las clases, modificarlas y compilarlas de nuevo? – Luixv
@Luixv: Deseo que el proceso de manipulación se realice automáticamente en el tiempo de ejecución; la modificación del código fuente real manualmente no es una opción, porque las transformaciones no son correctas. – thkala
Si coloca la clase en un 'jar', el' nop' redundante se comprimirá bastante bien y el tamaño comprimido no será mucho mayor. –