【问题标题】:AspectJ parent methodAspectJ 父方法
【发布时间】:2016-01-17 16:44:16
【问题描述】:

我有一个 around 方法试图在 dispatchTouchEvent 方法上隐藏键盘。

@Around("execution(boolean (@com.savaskoc.keyboard.KeyboardHide *).dispatchTouchEvent(android.view.MotionEvent))")

如果我像这样覆盖 android.app.Activity 中的 dispatchTouchEvent 方法,效果会很好

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    return super.dispatchTouchEvent(ev);
}

有没有办法拦截父类的方法?

Ps:我尝试将“执行”更改为“调用”,它给出了;

[warning] advice defined in com.savaskoc.keyboard.KeyboardAspect has not been applied [Xlint:adviceDidNotMatch

我有一个名为BaseActivity 的注释类。当我像这样覆盖dispatchTouchEvent 时,周围工作

@KeyboardHide
public abstract class BaseActivity extends ToolbarActivity {
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        return super.dispatchTouchEvent(ev);
    }
}

但是当我删除这个方法时,我会收到类似上面的警告

【问题讨论】:

    标签: android aspectj


    【解决方案1】:

    你要么拦截调用而不是像这样的执行:

    call(boolean (@com.savaskoc.keyboard.KeyboardHide *).dispatchTouchEvent(android.view.MotionEvent))
    

    或者,如果这还不够好,因为调用是从您的 AspectJ 编译器控制之外的代码进行的,您可以继续使用执行切入点,但需要将方面编织到您想要通过二进制编织拦截的第三方库中,创建一个新的编织版本。

    Hyperion 编辑后更新:

    警告advice ... has not been applied [Xlint:adviceDidNotMatch] 仅仅意味着AspectJ 编译器没有找到任何连接点来编织你的切入点。在这种情况下,它的意思就是我上面所说的:

    正在从您的 AspectJ 编译器控制之外的代码进行调用

    这意味着(换句话说,重复我自己)要么你必须通过二进制编译时编织或在运行时通过加载时编织将你的方面代码编织到包含类 ToolbarActivity 的原始 JAR 中,确保方面weaver 在原始 JAR 之前加载,因此它可以在类加载期间拦截它。我不知道 LTW(或一般的 Java 代理)是否可以在 Android JVM 上使用(我猜没有),因为我一生中从未使用过 Android,但这两个是您拥有的选项。如果所有其他方法都失败了,覆盖您想要拦截的方法的解决方法总是有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多