2014-09-23 24 views
0

我想第一次使用@DeclareMixin,並且我做的是不正確的事情,或者某處存在錯誤。@DeclareMixin添加了其他類不可見的方法

我已經將我的示例代碼發佈到github上:https://github.com/benze/AspectJError.git。我也在這裏粘貼了一些小東西。

如果我使用反編譯器查看ApplyAspect.class的編譯代碼,我可以看到ajc已正確添加到已實現的接口中。 但是,編譯器在測試中抱怨ApplyAspect沒有setCreated()或getCreated()方法。

此外,如果我嘗試從命令行編譯項目,我也會得到相同的編譯錯誤。

我不確定我在做什麼錯,或者如果在@DeclareMixin指令的其他地方有一個錯誤。

接口CreatedBean.java:

public interface CreatedBean { 
    public Object getCreated(); 
    public void setCreated(final Object created); 
} 

實施CreatedBeanImpl.java:

public class CreatedBeanImpl implements CreatedBean{ 
     private Object created; 

     public Object getCreated(){ 
      return this.created; 
     } 

     public void setCreated(final Object created){ 
      this.created = created; 
     } 
} 

方面定義:

@Aspect 
public class DeclareMixinAspect { 
    @DeclareMixin("com.benze.bo.ApplyAspect") 
    public CreatedBean auditableBeanMixin(){ 
     return new CreatedBeanImpl(); 
    } 
} 

被建議類(com.benze.bo PKG):

public class ApplyAspect { 
    private String name = "test class"; 
} 

類欲以ApplyAspect:

public class Test { 

    public static void main(String[] args) { 
     ApplyAspect aa = new ApplyAspect(); 
     aa.setCreated(new Date()); 
     System.out.println(aa.getCreated().toString()); 
     System.out.println(aa.toString()); 
     System.out.println("all done"); 
    } 
} 

聚甲醛是非常基本的,只有AspectJ的插件(和依賴性)加入。我正在使用AJ 1.8.2。

回答

1

我認爲你需要在投射測試類:

((CreatedBean)aa).setCreated(new Date()); 

System.out.println(((CreatedBean)aa).getCreated().toString()); 

IIRC的原因是標註樣式代碼旨在編譯用javac,這將不知道的DeclareMixin的影響。

+0

Ugg - 需要每次投射都很難看。我知道在AJ語法中,我可以將實現聲明爲接口的一部分(內部靜態方面),然後只需使用一個簡單的'declare parents:xxx implements yyy'應用接口。然後我不需要投下'aa'豆。有沒有辦法將兩者結合起來?即:使用AJ語法添加接口實現(而不是註釋樣式),但保持實現和接口分離(每個都在它自己的.java文件中)? – 2014-09-24 04:51:28

+0

投射解決了這個問題,但正如我所說的,如果可能的話,我寧願不必去處理。 IIRC,使用AJ表示法不需要我施放;在Annotation風格中是否有相同的內容? – 2014-09-24 15:04:54

相關問題