在AspectJ上加入切入点

时间:2011-12-06 01:10:54

标签: java android aspectj aop

我是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();
}

但我不确定这是否正确。如何计算组合切入点之间和之间的差异。是否有类似“after()”的东西?

先谢谢。

1 个答案:

答案 0 :(得分:0)

是的,有一个“after()”。但我不确定你是否正确使用cflow。 cflow意味着控制流程。这是一个切入点,只要某个切入点在堆栈上就会命中。每当你进入一个方法调用(在方法调用中,在方法调用中)与其他切入点匹配时。

这里你想要的是在第一个方法调用之前设置start并在最后一个方法调用之后设置end。中间方法调用无关紧要,所以我删除了那个切入点。

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();
    }

}

请注意,此方面只有一个实例。