Pregunta

un colega me señaló el otro día para BCEL que , lo mejor que puedo decir de su explicación y de una lectura rápida, una forma de modificar en tiempo de ejecución el código de bytes.Mi primer pensamiento fue que sonaba peligroso, y mi segundo pensamiento fue que sonaba bien.Luego me dio un poco más de pensamiento y recordé la codinghorror post en monkey patching y se dio cuenta de que esta era básicamente la misma cosa.Alguien ha utilizado alguna vez BCEL para nada práctico?Estoy en lo cierto que este es básicamente el tiempo de ejecución monkey patching, o me estoy perdiendo algo?

¿Fue útil?

Solución

Es un poco más bajo nivel de clásico monkey patching, y por lo que he leído, las clases ya cargado en la máquina virtual no se actualizan.Sólo es compatible con el almacenamiento en archivos de clase de nuevo, no modificar el tiempo de ejecución de las clases.

Otros consejos

De BCEL del FAQ:

Q:Puedo crear o modificar las clases dinámicamente con BCEL?

Una:BCEL contiene clases útiles en la util paquete, es decir, cargador de clases y JavaWrapper.Echa un vistazo a la ProxyCreator ejemplo.

Pero monkeypatching es...uhm...controvertido, y que probablemente no debería utilizar si su idioma no lo admite.

Si usted tiene un buen caso de uso para ello, sugiero embbededing Jython?

Usted podría mirar como monkey patching.Yo prefiero no usarlo (tal vez nunca se enfrentó a un buen caso de uso para que?), pero estar familiarizado con él, para tener una idea de cómo la Primavera y el Hibenrate usarlo y por qué).

Ver este mundo real ejemplo: Jawk - Compilador Módulo.BCEL es útil para la "compilación" ur de idioma personalizado.

BCEL no admite monkey patching, sólo se manipula con bytecode y posiblemente lo carga en una costumbre cargador de clases.Sin embargo, usted puede implementar monkeypatching en la JVM el uso de la biblioteca como BCEL y Java agente.El Java agente (cargado por javaagent argumento) se puede acceder a la Instrumentación de la API y modificar las clases cargadas.No es difícil de implementar a través de algunos puentes.

Pero recuerda:

  • No estoy seguro de si tener que usar -javaagent es algo que usted desea.
  • En cualquier idioma, monkey patching puede llevar a mal comportamiento previsible.
  • Puede modificar un método.En teoría, usted puede también agregar algunos de método, pero se necesita compilar el proyecto en contra de la modificación (parches) de las clases.Creo que esto sería causa de mucho dolor y no es digno de ella.Hay otros idiomas que el apoyo (por ejemplo,Groovy) o suppport algo similar (por ejemplo,las conversiones implícitas en la Scala).
  • Es mejor diseñar tu API, así que el uso de monkey patching.Puede ser muy útil para las bibliotecas de terceros.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top