AspectJ в Android: вызов pointcut (* Activity.onCreate (..)) не выбирает вызовы Activity.onCreate () - PullRequest
7 голосов
/ 15 июня 2011

Я использую AspectJ в своем проекте Android, и я хотел бы написать pointcut, который перехватывает все вызовы onCreate() и onDestroy() моей деятельности.Я довольно новичок в AspectJ, поэтому, возможно, я что-то здесь упускаю, но почему это:pointcut createActivity(Activity a) : target(a) && execution(* Activity.onCreate(..)) && within(com.test.activities..*);работает и это:target(a) && call(* Activity.onCreate(..)) && within(com.test.activities..*);не работает?

1 Ответ

11 голосов
/ 16 июня 2011

Приятно видеть, как другие люди отправляются в aspectJ и Android: -)

При использовании aspectJ с android вы ограничены ткачеством во время компиляции, что в основном означает, что вы можете перехватывать только собственный код.

Первый пример работает, потому что при использовании pointcut execute () код сплетается «внутри» вашего Activitiy.onCreate ().

Второй пример не работает, потому что совет должен будет получитьвплетены в методы, которые вызывают onCreate вашей деятельности.Это, вероятно, что-то вроде ActivityManager, которое вы не можете изменить.

В качестве ссылки вот что я использую в разработке:

public aspect LogAspect {

    public String ATAG = "LogAspect";

    pointcut tolog1() : execution(* Activity+.*(..)) ;
    before() : tolog1() {
        String method = thisJoinPoint.getSignature().toShortString();

        Log.d(ATAG, "=========== entering " + method+", parms="+Arrays.toString(thisJoinPoint.getArgs()));
    }

}
...