【发布时间】:2018-01-10 05:11:44
【问题描述】:
我试图在调用方法之前注入一些样板代码,我一直在使用 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
错误块
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)
【问题讨论】:
-
你使用 Spring AOP 还是 AspectJ?您将问题标记为“spring”,但如果您的应用程序在 Android 上运行,我假设没有 Spring,只有 Java 和 AspectJ。你能启发我吗?我还需要知道您如何编译代码以及您的 Android 应用程序的类路径中有什么(例如 aspectjrt.jar)。最好在 GitHub 上提供MCVE,但至少在这里。
-
@kriegaex 好的,我将在 Github 上上传项目并在此处分享链接。是的,这里没有仅使用 AspectJ 的弹簧。谢谢
-
android上的aspectj非常不稳定。它不能开箱即用。有时类没有被挥动,静态方法错误和运行它时出现 proguard 问题,使用数据绑定和 java 8 兼容性是一些问题。希望有人会编写一个插件,它可以与所有这些东西结合使用。 Aspectj 本身就是一个非常强大的东西。它可以使Android开发的生活变得轻松。我认为 java 字节码与 Android 字节码有很大不同,我和你有同样的问题。当我反编译 apk 时,它有 aspectj 方法,但静态方法错误即将到来。
-
@johnsmith,您的说法“Android 上的 AspectJ 非常不稳定”完全是错误的。 “开箱即用”是什么意思?它需要一个特殊的编译器,所以你必须正确配置它。一旦你这样做了,它就会完美地工作。如果有时类不是编织的,有时它们是编织的,那么这是您的构建管理或 AspectJ 切入点中的问题。 AspectJ 本身不是问题,问题在于 PC。
标签: java android annotations aop aspectj