Pregunta

Estoy escribiendo mi tesis de máster, que se ocupa de AOP en .NET, entre otras cosas, y hablar de la falta de apoyo para la sustitución de las clases en tiempo de carga como un factor importante en el hecho de que actualmente no hay .NET marcos AOP que realizan cierto tejer dinámico -. no sin imponer el requisito de que las clases de tejidos deben extenderse ContextBoundObject o MarshalByRefObject o exponer todas sus semántica en una interfaz

Sin embargo, puede hacer esto con Java en la JVM gracias a ClassFileTransformer:

  • Extiendes ClassFileTransformer.
  • suscribe al evento de carga de clase.
  • En la carga de clases, que reescribir la clase y sustituirla.

Todo esto está muy bien, pero mi director del proyecto me ha pedido, bastante en el último minuto, para darle una lista de marcos (y lenguajes asociados) que hacen / no son compatibles con el reemplazo de clase. Realmente no tengo tiempo para buscar esto ahora:. No me sentiría cómodo simplemente hacer una investigación superficial y que podría poner información errónea en mi tesis

Así que les pido, oh comunidad de programación omnipotente, ¿puedes ayudar? Por supuesto, yo no estoy pidiendo que la investigación Esta mismos. Simplemente, si usted sabe seguro que un determinado marco soportes / no soporta esto, dejan como una respuesta. Si no está seguro, por favor no se olvide de señalarlo.

Muchas gracias!


EDIT: @ewernli

  • Me estoy preguntando por (2).
  • En C # que de hecho puede emitir código en tiempo de ejecución y crear nuevas clases dinámicamente, pero son new clases, que no sustituyen a una clase existente. Lo que me gustaría hacer es transformar la clase en tiempo de carga, como se puede hacer en Java con el ClassFileTransformer.
  • Acerca de modificar la firma de un método: sí, tienes razón. Debería haber mencionado que en mi caso no quiero modificar la interfaz de clase, sino más bien el contenido de sus métodos.

Su respuesta fue muy útil. Gracias:)

¿Fue útil?

Solución

¿Usted está preguntando por (1) sustituto real de clase en tiempo de ejecución, o (2) Equipamiento para transformar la clase cuando se carga o (3) idiomas, que la carga de clases de apoyo dinámico?

Java dinámica de soporte de carga de clases con ClassLoader, transformación con ClassFileTransformer, pero ningún sustituto real de clase.

No estoy seguro para C #, pero creo que se puede emitir el código en tiempo de ejecución y crear nueva clase de forma dinámica, por lo que se puede lograr (3) y, probablemente, (2).

reemplazo verdadera clase es principalmente soportada sólo por lenguaje dinámico , por ejemplo Smalltalk, Ruby, Python y supongo que algunos otros. Esto requiere la transformación de las instancias de la clase para que coincida con la nueva forma. Por lo general, se inicializan los nuevos campos a cero si los cambios de clase.

Que yo sepa, los lenguajes dinámicos portado a la JVM hacen un amplio piratería del cargador de clases de apoyo a la sustitución de la clase en tiempo de ejecución. Para JRuby, consulte Un primer contacto con la invocación dinámica para conseguir más punteros cómo lo hacen ahora, lo que es problemático y la forma en la próxima invokedynamic podría ayudar.

Esto no es ofrecido en lenguas tipos estáticos debido a la complicación con el sistema Tipo . Si un cambio de método de firma en una clase, otras clases existentes ya cargados podrían cumplir no es necesario con la nueva firma del método que no es seguro. En java sin embargo, puede cambiar un método siempre que la firma es la misma mediante el plataforma Java Arquitectura depurador .

Ha habido algún intento de añadir esta función a Java, y / o lenguajes de tipado estático:

  • soporte de ejecución para las clases de Java con seguridad de tipos dinámicos
  • Apoyando no anticipada dinámico Adaptación de Comportamiento Application
  • Una técnica para Dinámico Actualización de software de Java

Este documento proporciona una visión general de los problemas relacionados

  • Influencia de los sistemas de tipo dinámico en la evolución del software

No estoy seguro exactamente si esa dirección se pregunta inicial, pero estos indicadores podría ser interesante para su tesis de todos modos.

Otros consejos

El Java idioma no admite la sustitución archivo de clase. La JVM expone la función a través de las clases que mencionas. Por lo tanto todos los idiomas que han sido portados a la JVM puede tomar ventaja de ello.

Erlang soportes caliente código de intercambio, y si usted está buscando también para marcos teóricos que las actualizaciones de las clases del modelo dinámico, puede echar un vistazo a la Creol idioma (interpretado).

biblioteca de tiempo de ejecución de Objective-C soporta construcción dinámica y el registro de las clases, el registro método perezoso y "swizzling método" por el cual implementaciones de métodos se pueden cambiar en tiempo de ejecución. Las versiones anteriores apoyaron "swizzling Clase" por el cual una clase podría ser sustituido por otro en tiempo de ejecución, pero ahora método swizzling se utiliza en su lugar. Aquí está el documento de referencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top