我正在尝试使用 AOP 框架创建一个对象,该框架使用 CGLIB 创建代理对象。奇怪的是,“增强的”代理对象没有前一个类的任何注释!
谁能告诉我如何让 CGLIB 保留它创建的代理上的注释?
干杯! 尼拉夫
我正在尝试使用 AOP 框架创建一个对象,该框架使用 CGLIB 创建代理对象。奇怪的是,“增强的”代理对象没有前一个类的任何注释!
谁能告诉我如何让 CGLIB 保留它创建的代理上的注释?
干杯! 尼拉夫
CGLIB 创建给定类的子类以生成代理。除非在注释定义中明确指定,否则注释不会保留在子类中。@Inherited注释用于此目的。
您可以在定义的注解中使用此注解,并使它们在子类中可访问,如下所示:
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyAnnotation {
}
这不是“保留”注释的问题。CGLIB 代理实际上是生成的目标对象类的子类。这些子类可能没有注释,但它们的超类(即您自己的类)仍然会有它们。您使用的任何注解反射代码都需要能够回溯类层次结构以查找注解。
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,并且它是相当可扩展的。希望你好好利用图书馆。
这是一个有效的问题(我现在自己也遇到了),因为 a) 并非所有框架都足够聪明来检查父类 b) 即使它们足够聪明,他们也可能选择不这样做。后者似乎是 Guice 的情况。FWIW,https ://issues.apache.org/jira/browse/WICKET-1130是我发现这个问题时正在解决的问题。