Присоединение точек на AspectJ - PullRequest
1 голос
/ 06 декабря 2011

Я новичок в AspectJ, хотя я знал об этой методологии AOP много лет. Теперь я впервые использую его в своем приложении для Android и хочу задать несколько вопросов относительно него.

У меня есть код Java:

    private void mainView() {
        ... (some code)
        <A>
    setContentView(R.layout.main);
    mView = findViewById(R.id.Main_Root);
    mView.setOnTouchListener(this);
        <B>
        ... (some code)
    }

У меня есть следующий код AspectJ:

public aspect mainViewTiming {
    pointcut callSetContentViewTiming():
        call(* android.app.Activity.setContentView(..))
        && withincode(void mainView(..))
    ;

    pointcut callFindViewById(): 
        call(* android.app.Activity.findViewById(..))
        && withincode(void mainView(..))
    ;

    pointcut callSetOnTouchListener(): 
        call (* android.view.View.setOnTouchListener(..))
        && withincode(void mainView(..))
    ;

 }

Теперь у меня вопрос, как мне использовать AspectJ и вычислить время, необходимое для запуска до?

У меня есть 3 точки, и я хотел бы знать, как лучше всего их объединить, чтобы получить этот эффект? По этой ссылке я узнал, что могу использовать «cflow»: http://www.eclipse.org/aspectj/doc/released/progguide/language-joinPoints.html

before(): cflow(callSetContentViewTiming()) && cflow(callFindViewById()) && callSetOnTouchListener() {
    start = System.currentTimeMillis();
}

Но я не был уверен, правильно ли это. И как мне рассчитать разницу между и при комбинировании pointcuts. И есть ли что-то вроде "after ()"?

Спасибо заранее.

1 Ответ

0 голосов
/ 07 июля 2012

Да, есть "после ()".Но я не уверен, что вы правильно используете cflow.cflow означает поток управления.Это pointcut, который срабатывает всякий раз, когда определенный pointcut находится в стеке.Всякий раз, когда вы находитесь внутри вызова метода (то есть внутри вызова метода, то есть внутри вызова метода), совпадающего с этим другим pointcut.

Здесь вы хотите установить start до первого вызова метода и установить end afterпоследний вызов метода.Вызов среднего метода не имеет значения, поэтому я исключил этот pointcut.

public aspect MainViewTiming {

    pointcut mainView() : withincode(void mainView(..));

    pointcut callSetContentViewTiming() :
        call(* android.app.Activity.setContentView(..)) && mainView();

    pointcut callSetOnTouchListener() :
        call (* android.view.View.setOnTouchListener(..)) && mainView();

    before() : callSetContentViewTiming() {
        start = System.currentTimeMillis();
    }

    after() : callSetOnTouchListener() {
        end = System.currentTimeMillis();
    }

}

Обратите внимание, что будет только один экземпляр этого аспекта.

...