AOP 在覆盖的方法上应用自定义注解
AOP apply Custom Annotation on Overrided Methods
我正在尝试在调用方法之前注入一些样板代码,我一直在为此使用 AOP。
我成功制作了一个自定义注释,现在要管理流程,我需要制作另一个并管理流程。但是第二个抛出一个 NoSuchMethodFound 错误。我需要注释一个重写的方法。我也试图注释一个简单的方法,但没有这样做。这是看点Class
@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;
}
}
这是注释Class
@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();
}
这是 link 到完整的 GITHUB 存储库 Github
错误块
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 插件,我刚刚记起来了。你遇到的问题和报错信息好像是一样的
我正在尝试在调用方法之前注入一些样板代码,我一直在为此使用 AOP。
我成功制作了一个自定义注释,现在要管理流程,我需要制作另一个并管理流程。但是第二个抛出一个 NoSuchMethodFound 错误。我需要注释一个重写的方法。我也试图注释一个简单的方法,但没有这样做。这是看点Class
@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;
}
}
这是注释Class
@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();
}
这是 link 到完整的 GITHUB 存储库 Github
错误块
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 插件,我刚刚记起来了。你遇到的问题和报错信息好像是一样的