Java 是否在CGLIB代理上保留注释?

Java 是否在CGLIB代理上保留注释?,java,annotations,cglib,Java,Annotations,Cglib,我试图使用AOP框架创建一个对象,该框架使用CGLIB创建代理对象。 奇怪的是,“增强的”代理对象没有上一个类的任何注释 有人能告诉我如何让CGLIB保留它创建的代理上的注释吗 干杯! Nirav这不是“保留”注释的问题。CGLIB代理实际上是目标对象类的子类。这些子类可能没有注释,但它们的超类(即您自己的类)仍然有注释。任何反映您使用的代码的注释都需要能够回溯类层次结构以查找注释。这是一个有效的问题(我现在自己也遇到了),因为a)并非所有框架都足够聪明,可以检查父类b)即使它们足够聪明,它们也

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

有人能告诉我如何让CGLIB保留它创建的代理上的注释吗

干杯!
Nirav

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

这是一个有效的问题(我现在自己也遇到了),因为a)并非所有框架都足够聪明,可以检查父类b)即使它们足够聪明,它们也可能选择不检查。Guice的情况似乎是后者。FWIW是我发现这个问题时正在解决的问题。

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

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

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

Cglib无法在不更改其内部实现的情况下保留注释。但这很复杂,相信我,我试过了。我最终提出的修改版本是如此复杂,以至于我决定实现另一个能够实现这种功能的代码生成库

下面是一个如何创建

@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,并且具有很强的可扩展性。希望您能充分利用这个库。

继承的注解解决了这个问题吗?如果是这样的话,你可以考虑批准这个答案。谢谢。
@Inherited
解决不了这个问题(我自己试过了)。就我个人而言,我使用了一个Spring项目,通过使用AnnotationUtils实用程序类解决了这个问题,所以你可以看到它是如何工作的,而且您的修复似乎不起作用。@继承仅在注释的目标是类时起作用-您的子类代理的方法仍然没有注释。我不知道是否适用于注释类,但方法仍然没有注释。