【问题标题】:AspectJ adding pointcut execution for onCreate() methodsAspectJ 为 onCreate() 方法添加切入点执行
【发布时间】:2015-12-23 12:59:14
【问题描述】:

我想为我的 Android 应用程序编写一个通用的切入点执行,它有 3 个活动,在所有 3 个活动中只切入 onCreate() 方法。这个切入点怎么写?

【问题讨论】:

    标签: android aspectj


    【解决方案1】:

    一般:

    pointcut GIVE_IT_A_NAME() : execution(void Activity.onCreate(..));
    

    或者,如果您想获取所有Activity 子类,则添加+

    pointcut GIVE_IT_A_NAME() : execution(void Activity+.onCreate(..));
    

    然后,您可以使用切入点,例如:

    before() : GIVE_IT_A_NAME() {
        // do something
    }
    

    您也可以使用after(),这取决于您要达到的目标。

    正如你所说,你的类需要它,事实上,请注意你不能在 Android 核心类中注入代码,因为它们不是你的 APK 的一部分,而是在设备上提供的。

    如果你想确保只注入你的类,你可以在切入点定义中添加一些条件:

    pointcut GIVE_IT_A_NAME() : execution(void *.onCreate(..))
    && within(YOUR_MAIN_PACKAGE_NAME.*)
    && this(android.app.Activity+);
    

    因此切入点必须在该特定包名称内,并且类类型必须是android.app.Activity 或子类。当然,如果您使用的是 Android 支持库,则需要更改最后一个条件。

    【讨论】:

    • 太棒了!我不确定你是如何注入代码的,但我在开发过程中总是很容易将 -showweaveinfo 参数添加到 AspectJ 编译器,这样我就可以看到我的切入点已应用于哪些类和方法,或者它们是否根本没有(所以可能是切入点定义中的一个问题)。
    • 我还有 1 个疑问。我还有其他切入点可以切入每个方法,包括 onCreate()。现在我想要 2 个切入点 - 1 个仅用于 onCreate(),另一个用于除 onCreate() 之外的所有其他方法。我如何获得这 2 个切入点?
    • 我应该看到代码或者至少知道更多关于“所有其他方法”的信息,所以对你来说最好的选择是为这个问题创建一个新的问题,这是不同的。我可以给你的一个建议是将不同的切入点与布尔表达式结合起来。很难在评论中写出来,所以看这里的答案:stackoverflow.com/questions/20835547/…
    • 谢谢,但我在stackoverflow.com/questions/34437847/…提出了一个新问题
    • 如何只获得没有超类的子类
    猜你喜欢
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2019-12-31
    相关资源
    最近更新 更多