【问题标题】:Using AspectJ for adding functionality for superclass method使用 AspectJ 为超类方法添加功能
【发布时间】:2015-11-05 13:03:07
【问题描述】:

我编写 Android 应用程序,我想使用自定义字体。所以,我决定使用Calligraphy

要使用这个库,我需要在每个 Activity 中重写基本方法 attachBaseContext

public class MainActivity extends AppCompatActivity {
...
    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
    }
...
}

当然我可以使用 OOP,但我想使用 AspectJ

为了在我的gradle 项目中包含AspectJ,我使用gradle-android-aspectj-plugin

这是我方面的代码:

@Aspect
public class MyAspect {
    @Before("execution(void com.youtubeplaylist.app.ui.activity.*+.attachBaseContext(context))")
    public void beforeCalligraphy(ProceedingJoinPoint thisJoinPoint) throws Throwable {
        Object[] args = thisJoinPoint.getArgs();
        Context c = (Context) args[0];
        c = CalligraphyContextWrapper.wrap(c);
        args[0] = c;
        thisJoinPoint.proceed(args);
        System.out.println("Aspect finished successfully");
    }
}

因此,“方面已成功完成” 永远不会打印。请帮助我了解问题所在。

【问题讨论】:

  • 你在项目的.project文件中添加了ajdt支持吗?
  • 对不起@Materazzi06,我不明白你的意思。我github.com/uPhyca/gradle-android-aspectj-plugin,我有gradle 项目。我没有任何*.poject 文件。
  • 好吧,对不起。我在 Eclipse 中使用 AspectJ,即使对于私有和超类方法,一切似乎都很好。我不确定 gradle 项目。
  • 你可能不得不去调用加入点而不是执行:stackoverflow.com/a/18149106/2191746

标签: java android aop aspectj


【解决方案1】:

我在另一个问题上引用this answer

在android中使用aspectJ时,您仅限于编译时编织,这基本上意味着您只能拦截您拥有的代码。

编译时编织只会改变你自己的 .class 行为方式。如果您自己重写 attachBaseContext 方法并将其留空,您的方面将起作用。

【讨论】:

    猜你喜欢
    • 2012-03-04
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    相关资源
    最近更新 更多