簡體   English   中英

保留CGLIB代理上的注釋?

[英]Retain annotations on CGLIB proxies?

我試圖使用AOP框架創建一個對象,該框架使用CGLIB來創建代理對象。 奇怪的是,“增強型”代理對象沒有上一課所有的任何注釋!

任何人都可以告訴我如何讓CGLIB保留其創建的代理上的注釋?

干杯! Nirav

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是我在發現這個問題時遇到的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM