java annotations cglib

java - ¿Conservar anotaciones en proxies CGLIB?



annotations (4)

Estoy tratando de crear un objeto utilizando un marco AOP que usa CGLIB para crear objetos proxy. Por extraño que parezca, el objeto proxy "mejorado" carece de NINGUNA anotación de la clase anterior.

¿Puede alguien decirme cómo puedo hacer que CGLIB conserve las anotaciones en los proxies que crea?

¡Aclamaciones! Nirav


CGLIB crea subclases de clases dadas para generar proxies. Las anotaciones no se conservan en las subclases a menos que se especifique explícitamente en la definición de la anotación. @Inherited anotación @Inherited se utiliza para este propósito.

Puede usar esta anotación en las anotaciones que defina y hacerlas accesibles en subclases, de la siguiente manera:

@Inherited @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface MyAnnotation { }


Cglib no es capaz de retener anotaciones sin cambiar su implementación interna. Sin embargo esto es bastante complicado y créeme que lo intenté. Mi versión modificada que finalmente encontré era, sin embargo, tan complicada que decidí implementar Byte Buddy , otra biblioteca de generación de código que es capaz de tal funcionalidad.

Aquí hay un ejemplo de cómo puedes crear una subclase que

@Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation { } @MyAnnotation class MyClass { } assertThat(new ByteBuddy() .subclass(Object.class) .attribute(TypeAttributeAppender.ForSuperType.INSTANCE) .make() .load(getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER) .getLoaded() .isAnnotationPresent(MyAnnotation.class), is(true));

Byte Buddy viene con una extensa documentación de texto completo y javadoc y es bastante extensible. Espero que hagas buen uso de la biblioteca.


Es un problema válido (me estoy encontrando ahora con mi mismo) porque a) no todos los marcos son lo suficientemente inteligentes como para inspeccionar las clases para padres b) incluso si son lo suficientemente inteligentes, pueden elegir no hacerlo. Este último parece ser el caso de Guice. FWIW, https://issues.apache.org/jira/browse/WICKET-1130 es el problema en el que estaba trabajando cuando descubrí esto.


Esto no es un problema con "retener" las anotaciones. Los proxies CGLIB son en realidad subclases generadas de la clase del objeto de destino. Es posible que estas subclases no tengan anotaciones, pero su superclase (es decir, su propia clase) aún las tendrá. Cualquier código que refleje las anotaciones que utilice debe ser capaz de buscar una copia de seguridad de la jerarquía de clases para buscar anotaciones.