Una aplicación común es generar clases de proxy en tiempo de ejecución, es decir, para crear una subclase en tiempo de ejecución que intercepta todas las invocaciones de métodos. Ejemplos:
Hibernate utiliza Proxies para interceptar invocaciones de método en entidades para implementar la carga diferida, es decir, recuperar el objeto de la base de datos cuando se accede por primera vez.
Spring Frameworkuses Proxies to implement its AOP support, que entre otras cosas potencia su soporte para transacciones declarativas. También utiliza proxies para aplicar un alcance adecuado.
EJB utiliza proxies para implementar transacciones administradas por contenedor, comprobación de autorización y para aplicar interceptores definidos por el usuario.
CDI implementaciones deben también proxy de los granos de manejo para garantizar la correcta determinación del alcance. Sospecho que también usan una biblioteca de ingeniería de código de bytes.
I recientemente usamos Javassist para implementar una memoria caché transparente para los valores de retorno del método, interceptando todas las invocaciones de métodos y solo delegando a la súper implementación en la primera invocación.
Tenga en cuenta que java.lang.reflect.Proxy
puede generar clases de proxy en tiempo de ejecución, pero solo puede implementar interfaces, no extender una clase. Todos los casos de uso anteriores requieren el proxying de clases.
Acerca de proyectos reales: sé que playFramework usó Javaassist. En este caso, tenemos el código fuente ... Y yo, probé, que Hibernate también usa javassist. – user471011
Bien dicho ausgoo. –