18

我正在尝试使用 AOP 框架创建一个对象,该框架使用 CGLIB 创建代理对象。奇怪的是,“增强的”代理对象没有前一个类的任何注释!

谁能告诉我如何让 CGLIB 保留它创建的代理上的注释?

干杯! 尼拉夫

4

4 回答 4

15

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

您可以在定义的注解中使用此注解,并使它们在子类中可访问,如下所示:

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyAnnotation {
}
于 2012-01-08T16:28:12.960 回答
5

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

于 2009-11-10T09:52:52.780 回答
4

Cglib 不能在不更改其内部实现的情况下保留注释。然而,这很复杂,相信我我试过了。然而,我最终想出的修改版本非常复杂,以至于我决定宁愿实现Byte Buddy,这是另一个能够实现此类功能的代码生成库。

这是一个如何创建子类的示例

@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,并且它是相当可扩展的。希望你好好利用图书馆。

于 2014-05-02T18:35:59.357 回答
3

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

于 2010-09-14T23:26:36.260 回答