尝试使用AOP框架创建对象,该框架使用CGLIB创建代理对象。 奇怪的是,“增强型”代理对象没有前一课所有的任何注释!
有谁能告诉我如何让CGLIB保留其创建的代理上的注释?
干杯! Nirav
答案 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,它具有很强的可扩展性。希望你好好利用图书馆。