java - AOP 在重写方法上应用自定义注释

标签 java android annotations aop aspectj

我试图在调用方法之前注入(inject)一些样板代码,我一直在使用 AOP。

我成功制作了一个自定义注释,现在为了管理流程,我需要制作另一个并管理流程。但第二个会抛出 NoSuchMethodFound 错误。我需要注释一个重写的方法。我也尝试过注释一个简单的方法,但没有成功。这是方面类

@Aspect
public class AnnotationAspect {
private static final String TAG = "AnnotationAspect";

private static final String POINTCUT_METHOD =
        "execution(@org.android10.gintonic.annotation.MyAnnotation * *(..))";

@Pointcut(POINTCUT_METHOD)
public void methodToAnnotate() {

}
@Around("methodToAnnotate()")
public Object weaveJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {
    Log.d(TAG, "weaveJoinPoint: Inside the AnnotationAspect Class");
    joinPoint.proceed();
    return null;
}
}

这是注释类

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
public @interface MyAnnotation {
}

这就是我的称呼。我还通过在 onResume 等重写方法上调用它来尝试相同的注释。

@MyAnnotation
public void myMethod() {
    Toast.makeText(this, "Hello myMethod", Toast.LENGTH_SHORT).show();
}

这是完整 GITHUB 存储库的链接 Github

错误 block

java.lang.NoSuchMethodError: No static method aspectOf()Lorg/android10/gintonic/aspect/AnnotationAspect; in class Lorg/android10/gintonic/aspect/AnnotationAspect; or its super classes (declaration of 'org.android10.gintonic.aspect.AnnotationAspect' appears in /data/app/android10.org.viewgroupperformance-2/split_lib_slice_9_apk.apk)
             at org.android10.viewgroupperformance.activity.LinearLayoutTestActivity.myMethod(LinearLayoutTestActivity.java:51)
             at org.android10.viewgroupperformance.activity.LinearLayoutTestActivity.onCreate(LinearLayoutTestActivity.java:45)
             at android.app.Activity.performCreate(Activity.java:6582)
             at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1113)
             at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2532)
             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2667)
             at android.app.ActivityThread.-wrap11(ActivityThread.java)
             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1494)
             at android.os.Handler.dispatchMessage(Handler.java:111)
             at android.os.Looper.loop(Looper.java:207)
             at android.app.ActivityThread.main(ActivityThread.java:5776)
             at java.lang.reflect.Method.invoke(Native Method)
             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

最佳答案

很抱歉将其写为答案,但这是共享代码的唯一方法。它只是为了帮助您,而不是在第一次迭代中回答问题。

因此,我在 Android 世界之外用纯 Java + AspectJ 重新创建了您的情况,以查看问题是您的代码还是其他问题,例如目标设备上的编译、打包、部署、运行时类路径。

标记注释:

我使用了切入点中给出的包名称。

package org.android10.gintonic.annotation;

import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Retention(RUNTIME)
@Target({ METHOD, CONSTRUCTOR })
public @interface MyAnnotation {}

驱动程序应用程序:

package de.scrum_master.app;

import org.android10.gintonic.annotation.MyAnnotation;

public class Application {
  @MyAnnotation
  public void myMethod() {
    System.out.println("Hi there!");
  }

  public static void main(String[] args) {
    new Application().myMethod();
  }
}

方面:

package de.scrum_master.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class AnnotationAspect {
  private static final String POINTCUT_METHOD =
    "execution(@org.android10.gintonic.annotation.MyAnnotation * *(..))";

  @Pointcut(POINTCUT_METHOD)
  public void methodToAnnotate() {}

  @Around("methodToAnnotate()")
  public Object weaveJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {
    System.out.println(joinPoint);
    joinPoint.proceed();
    return null;
  }
}

控制台日志:

execution(void de.scrum_master.app.Application.myMethod())
Hi there!

所以中间结果是你的注释和方面看起来都不错。问题一定出在其他地方。正如我之前的评论中提到的,我的第一个猜测是目标设备上的类路径中缺少 aspectjrt.jar


更新:也许您应该使用 my old answer here 中提到的 Gradle AspectJ 插件我刚想起来。您遇到的问题和错误消息似乎是相同的。

关于java - AOP 在重写方法上应用自定义注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48180673/

相关文章:

pdf - 无法从 pdf 中删除注释

spring mvc 注释验证整数

java - 在 ebean 中创建一个表,其中两个列表连接到另一个表

android - Firebase Analytics,重新启用广告 ID 收集

java - treemap vs hashmap 并根据内存使用情况进行排序

android - OAuth2 请求缺少参数 access_token

java - SQLite 数据库 : Android studio custom auto incrementation

java - 带有 Spring 注解的 Bean 的多种配置

java - 如何从 xls 文件生成 xml 或 json 映射,然后从该映射生成 html 表(结构)?

java - 基本直接的 Tomcat-MySQL 链接