目標:使用AspectJ在執行特定方法後調用靜態方法。使用AspectJ註釋在執行重寫方法後提供邏輯
爲了這個問題,我們稱靜態方法System.out.println
和方法onConfigurationChanged
。
約束:
- 的
onConfigurationChanged
方法聲明,實施和在一個類被調用我無法控制的(不能被編織)*。 - 由於
onConfigurationChanged
在基類中有一個實現,所以子類可以覆蓋也可以不覆蓋(但在兩種情況下onConfigurationChanged
執行後仍應調用System.out.println
)。 - 使用註釋語法,因爲我的開發環境似乎不支持對本地方面語法的支持。
*注:這是構建一個Android應用程序的情況下,讓有問題的基類實際上是android.app.Activity
。很顯然編譯時編織是不可能的。我已經研究了加載時織入,但是我對於在這種情況下如何完成它並且不確定是否需要,因爲它是如此關鍵的代碼路徑。
我目前面臨的主要問題是子類沒有重寫該方法的情況。
我已經嘗試:與onConfigurationChanged
簽名指定
執行切入點,以確定
@After
建議,這就要求System.out.println
。@After("execution(void com.jkhong..*.onConfigurationChanged()) " + "&& !within(DefaultOnConfigurationChangedAspect)") public void onConfigurationChangedExecution() { doDefaultOnConfigurationChanged(); } private static void doDefaultOnConfigurationChanged() { System.out.println("Default onConfigurationChanged (mixed in)"); }
在將子類重寫onConfigurationChanged
方法的情況下將上述作品。
@DeclareMixin
瞄準的子類,返回一個匿名類實現調用System.out.println
。返回的接口具有與基類中的onConfigurationChanged
完全相同的簽名的單個方法。public interface OnConfigurationChangedListener { void onConfigurationChanged(); } @DeclareMixin("com.jkhong..*.*Activity") public static OnConfigurationChangedListener createDefaultListener() { return new OnConfigurationChangedListener() { @Override public void onConfigurationChanged() { doDefaultOnConfigurationChanged(); } }; }
不幸的是,上述不添加由縱橫提供到不覆蓋onConfigurationChanged
子類中的onConfigurationChanged
實現。它確實指定子類實現OnConfigurationChangedListener
接口,但由於該方法在其父類中實現,因此編譯器不會發出抱怨。 (如果我稍微調整了界面方法的簽名,使其不再匹配,我發現它確實被添加了,但這不是期望的結果。)
任何幫助非常感謝,謝謝。
非常感謝您的詳細信息!我希望不必使用本機方面的文件,但我想這是我唯一的選擇。根據你關於IDE的問題,我使用的是基於IntelliJ IDEA的Android Studio。我將研究可用的AspectJ插件。 –