保留CGLIB代理上的注释?

时间:2009-11-10 09:49:51

标签: java annotations cglib

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

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

干杯! Nirav

4 个答案:

答案 0 :(得分:15)

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

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

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,它具有很强的可扩展性。希望你好好利用图书馆。