2011-09-20 78 views
0

我想圍繞延伸,看起來像這樣的接口的方法做了一個建議:建議各地方法實現擴展接口

public interface StructureService { 
    void delete(FileEntry entry); 
} 

public interface FileService extends StructureService { 
    void dummy(); 
} 

實現像下面這些看起來類:

public class DbStructureService implements StructureService { 
    public void delete(FileEntry entry) { 
    } 
} 
public class DbFileService extends DbStructureService implements FileService { 
    public void dummy() { 
    } 
} 

我想匹配刪除方法,但只適用於實現FileService的類。

我已經定義以下方面:

public aspect FileServiceEventDispatcherAspect { 
    pointcut isFileService() : within(org.service.FileService+); 

    pointcut delete(FileEntry entry) : 
     execution(void org.service.StructureService.delete(..)) 
     && args(entry) && isFileService(); 

    void around(FileEntry entry) : delete(entry) { 
      proceed(entry); 
    } 
} 

的問題是,只要我已啓用isFileService切入點將匹配沒有類;即使有很多methos應該匹配

如果我將within(org.service.FileService+)替換爲within(org.service.StructureService+)它也可以正常工作。

我嘗試過試用這個()等,但沒有成功。我如何在aspectj中做到這一點?

編輯: 更新了實現接口的類的外觀。我認爲這種情況可能很難提供建議,因爲在DbFileService中沒有重寫的方法

+0

我使用二進制編譯時編織,如果這事宜 – jontro

+0

對於編譯時編譯此代碼的源代碼是正確的。可能問題在於「二元」,儘管不應該存在。 – alehro

+0

是的,我編輯了我的問題。你認爲這是aspectj不支持的場景嗎?在子類中建議沒有真正的功能 – jontro

回答

1

我想你的意思是DbFileService實現了FileService而不是StructureService。鑑於此,該代碼應工作:

public aspect FileServiceEventDispatcherAspect {  

pointcut delete(FileService this_, FileEntry entry) : 
    execution(void org.service.StructureService.delete(..)) 
    && args(entry) && this(this_); 

void around(FileService this_, FileEntry entry) : delete(this_, entry) { 
     proceed(this_, entry); 
} 
} 

的「內」的切入點是不適合在這裏,因爲它是「基於詞法結構切入點」("AspectJ in Action", second edition.

+0

謝謝,我弄糊塗的原因是在Eclipse AJDT中似乎有錯誤。標記顯示與所有簽名有關的類型的匹配。然而,編譯它的工作。 – jontro

+0

AJDT非常有用,但同時不是很可靠。它可能錯過實際存在建議的標記,發出關於「建議尚未應用」的警告等。 – alehro