保留CGLIB代理上的注释?

我试图使用AOP框架创建一个对象,该框架使用CGLIB来创建代理对象。 奇怪的是,“增强型”代理对象没有上一课所有的任何注释!

任何人都可以告诉我如何让CGLIB保留其创建的代理上的注释?

干杯! Nirav

CGLIB创建给定类的子类以生成代理。 除非在注释定义中明确指定,否则注释不会保留在子类中。 @Inherited注释用于此目的。

您可以在定义的注释中使用此批注,并使其在子类中可访问,如下所示:

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

这不是“保留”注释的问题。 CGLIB代理实际上是目标对象类的子类。 这些子类可能没有注释,但是它们的超类(即您自己的类)仍然会有它们。 您使用的任何注释reflection代码都需要能够查找类层次结构以查找注释。

这是一个有效的问题(我现在正在考虑自己)a)并非所有框架都足够智能来检查父类b)即使它们足够聪明,也可能选择不这样做。 后者似乎是Guice的情况。 FWIW, https ://issues.apache.org/jira/browse/WICKET-1130是我在发现这个问题时遇到的问题。

Cglib无法在不更改其内部实现的情况下保留注释。 然而,这很复杂,相信我,我试过。 我最终想出的改进版本是如此复杂,以至于我决定更好地实现Byte Buddy ,这是另一个能够实现这种function的代码生成库。

以下是如何创建子类的示例

 @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附带了大量的全文文档和javadoc,它具有很强的可扩展性。 希望你好好利用图书馆。