运行 AspectJ 会导致 NoSuchMethodError: Aspect.aspectOf

2023-11-26

我有一个非常简单的 AspectJ 方面(使用 @AspectJ),它只打印出一条日志消息。我的目标是在我的 Android 应用程序中提供建议代码。现在,只要我的应用程序源代码中有方面类本身,这个方面就可以完美地工作。一旦我将方面移动到不同的模块(java -> .jar 或 android lib -> .aar),我会收到以下运行时异常在我的应用程序中运行建议的代码时:

java.lang.NoSuchMethodError: com.xxx.xxx.TraceAspect.aspectOf

基本上我的结构是这样的:

Root
 + app (com.android.application)
   - MainActivity (with annotation to be adviced)
 + library (android-library)
   - TraceAspect (aspect definition)

从 ajc 编译器中,我可以看到 ajc 编译器选择了我的类并正确地建议它们,所以我真的不知道为什么只要我的源代码中有 @AspectJ 类它就可以工作,但是一旦我移动就停止工作将其保存到 jar 存档中。

我正在使用 gradle。我的应用程序的构建脚本非常简单。我按照中的说明进行操作http://fernandocejas.com/2014/08/03/aspect-oriented-programming-in-android/

import com.android.build.gradle.LibraryPlugin
import org.aspectj.bridge.IMessage
import org.aspectj.bridge.MessageHandler
import org.aspectj.tools.ajc.Main

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:0.12.+'
    classpath 'org.aspectj:aspectjtools:1.8.1'
  }
}

apply plugin: 'com.android.application'

repositories {
  mavenCentral()
}

dependencies {
  compile 'org.aspectj:aspectjrt:1.8.1'
  compile project (':library')
}


android.applicationVariants.all { variant ->
    AppPlugin plugin = project.plugins.getPlugin(AppPlugin)
    JavaCompile javaCompile = variant.javaCompile
    javaCompile.doLast {
        String[] args = ["-showWeaveInfo",
                         "-1.5",
                         "-XnoInline",
                         "-inpath", javaCompile.destinationDir.toString(),
                         "-aspectpath", javaCompile.classpath.asPath,
                         "-d", javaCompile.destinationDir.toString(),
                         "-classpath", javaCompile.classpath.asPath,
                         "-bootclasspath", plugin.project.android.bootClasspath.join(File.pathSeparator)]

        MessageHandler handler = new MessageHandler(true);
        new Main().run(args, handler)

        def log = project.logger
        for (IMessage message : handler.getMessages(null, true)) {
            switch (message.getKind()) {
                case IMessage.ABORT:
                case IMessage.ERROR:
                case IMessage.FAIL:
                    log.error message.message, message.thrown
                    break;
                case IMessage.WARNING:
                    log.warn message.message, message.thrown
                    break;
                case IMessage.INFO:
                    log.info message.message, message.thrown
                    break;
                case IMessage.DEBUG:
                    log.debug message.message, message.thrown
                    break;
            }
        }
    }
}

不确定是否重要,但以防万一,我方面的代码:

@Aspect
public class TraceAspect {
  private static final String POINTCUT_METHOD = "execution(@com.xxx.TraceAspect * *(..))";

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

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

类路径

我还检查了javaCompile.classPath并且它正确地包含library-classes.jar and my app-classes.jar。添加-log file to the ajc任务还显示文件已正确编织。

有任何想法吗?

重现此问题的最小示例

https://github.com/fschoellhammer/test-aspectj


我遇到了同样的问题,但我使用 Maven 而不是 Gradle。

在将方面类应用于目标类之前,首先需要将其“编织”到方面中。 编织方面类将添加两个静态方法(aspectOf 和 hasAspect)。

在我的特殊情况下,我没有编织我的方面。

可以通过将aspectj-maven-plugin添加到构建部分来完成。

<build>
<plugins>
  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <executions>
      <execution>
        <goals>
          <goal>compile</goal> 
        </goals>
      </execution>
    </executions>
  </plugin>
</plugins>

希望能帮助到你!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

运行 AspectJ 会导致 NoSuchMethodError: Aspect.aspectOf 的相关文章

  • Android Studio 与本地网络共享上的项目文件

    这是我的设置 Android Studio 项目文件位于 Ubuntu 14 10 盒子上的共享文件夹中 尝试在 Windows 8 机器上运行 Android Studio 1 0 2 并将 U 驱动器映射到包含项目文件的 Ubuntu
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • 图像作为电子邮件附件

    我想构建一个应用程序 我可以在电子邮件中附加图像 打开图像并将其设置为我的壁纸 我想让它跨平台 所以你能告诉我是否可以使用phonegap 或者我是否必须为iphone和android构建一个本机应用程序 您好 如果您只想通过电子邮件附加图
  • 从 BroadcastReceiver 类调用活动方法

    我知道我可以做一个内部接收器类来调用接收器中的任何方法 但我的主要活动太大了 要做的事情也很多 因此 我需要一个扩展广播接收器的类 但它不是内部类 并且可以从我的主要活动中调用一种方法 我不知道是否可能 但我的活动是家庭活动和 single
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • 对于一个单元格,RecyclerView onBindViewHolder 调用次数过多

    我正在将 RecyclerView 与 GridLayoutManager 一起使用 对于网格中的每个项目 我需要调用 REST api 来检索数据 然后 从远程异步获取数据后 我使用 UIL 加载 显示图像 一切似乎都很好 但我发现 on
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • Mipmap 与可绘制文件夹[重复]

    这个问题在这里已经有答案了 我正在使用 Android Studio 1 1 Preview 1 我注意到 当我创建一个新项目时 我得到以下层次结构 不同 DPI 的 Mipmap 文件夹 不再有不同 DPI 的可绘制文件夹 我应该将所有资
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • WorkManager 或 AlarmManager 用于日常请求然后通知工作?

    这是用例 用户设置具有特定时间的每日通知 在指定时间 发出网络请求以获取一些数据 然后使用检索到的数据显示通知 我不确定是否应该使用 AlarmManager 还是 WorkManager 来实现这个用例 据我了解 AlarmManager
  • 您使用什么物理 Android 设备进行测试?

    有什么好的推荐用于测试目的的物理 Android 设备吗 我正在苹果阵营寻找像 iPod touch 这样的设备 可以帮助 iOS 开发人员测试他们的东西 我知道有 Nexus One 但那东西相当昂贵 而且我并不真正关心手机的东西 而是可
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • Android 如何将总天数准确更改为年、月、日?

    我正在做一个应用程序 该应用程序与根据给定的生日日期输入获取一个人的年龄有关 为此 我从下面的代码中获取从该日期到当前日期的总天数 String strThatDay 1991 05 10 SimpleDateFormat formatte
  • 上网本上可以进行Android开发吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用我的上网本进行 Android 开发 但是当我尝试使用 Eclipse 运行 SDK 时 没有加载任何内容 上网本对于 Android 开发来
  • 插件“Android Bundle Support”不兼容

    大家好 自从上次更新以来 当我启动 android studio 时 我遇到了一个非常奇怪的错误 我有这个错误 插件错误 插件 Android Bundle Support 不兼容 直到构建 AI 195 SNAPSHOT 我在网上找不到任
  • 问题:为什么React Native Video不能全屏播放视频?

    我正在react native 0 57 7 中为android和ios创建一个应用程序并使用反应本机视频 https github com react native community react native video播放上传到的视频
  • 没有支持 FEATURE_CAMERA_EXTERNAL 的 Android 设备

    根据this doc https source android com devices camera external usb cameras一些 Android 设备允许使用 Camera2 API 访问外部 USB 摄像头 我检查了大约
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db
  • 有没有任何代码可以在android中设置壁纸而无需裁剪和缩放?

    我正在创建一个画廊应用程序 我的第一个应用程序 这是我的代码 Bitmap bmd BitmapFactory decodeStream is try getApplicationContext setWallpaper bmd catch
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐

  • 在活动之间共享域对象

    我已经在域对象中编写了应用程序逻辑 以启用多个用户界面并移植到其他平台 现在正在考虑为用户界面实现活动 考虑到每个活动都需要序列化其状态 确保我的域对象仅序列化一次的最佳方法是什么 如果您正在谈论序列化对象以在活动之间共享它们 您应该创建自
  • 导入项目出现无法解析目标“android-7”

    这个应用程序是我大约一年前完成的 但从未在市场上发布过 我现在尝试在 Eclipse 中打开它 进行一些小的修改并对代码进行一些处理 所以我导入了它 然后发现了这个奇怪的 无法解析目标 错误 它在我所有的 src 文件中突出显示了每个类的红
  • 为什么我无法使用 Type.InvokeMember 检索 out 或 ref 类型的参数值?

    标题很长 但我希望它具体一些 标题确实是个问题 尽管该方法InvokeMember正在呼叫有一个out参数并正在为该参数分配一个值 但我无法获取该值 这是我最初使用的代码 string parameter int result Conver
  • IE9 中的条件样式表

    IE9 应该支持条件注释 我有正确的 MIME 类型 type text css 所有其他条件样式表都被读入正确的浏览器 这是我无法阅读的内容 它与其他部分一起位于 head 中 但在 IE9 中不会出现在 head 中 对于愚蠢的问题感到
  • 使用 Firebase,Swift removeObserver(withHandle 不会删除观察者

    使用 Swift 3 中的removeObserver withHandle 观察者不会在 viewDidDisappear 上删除 var query FIRDatabaseQuery var postRef FIRDatabaseRef
  • Rails:模型实例方法还是辅助方法?

    按照惯例 以下内容应该定义为我的模型的实例方法还是辅助方法 app models user rb class User lt ActiveRecord Base def full name first name last name end
  • 超媒体与 Servicestack 新 API 链接

    我正在评估如何向 DTO 响应添加超媒体链接 虽然没有标准 但将 List 添加到响应 DTO 似乎是建议的方法 您知道使用ServiceStack框架实现的示例或参考吗 添加列表对我来说没问题 但我的疑问是在哪里放置以下链接的逻辑 在服务
  • WPF:在 TreeViewItem 中正确存储对象

    为了将对象 例如 类的实例 存储在 TreeViewItem 中 我当前将该对象存储在TreeViewItem s Header然后覆盖ToString该类的方法 以便它显示正确的字符串标题 然后我在事件期间将对象投射回来 这是实现这种事情
  • Fortran 中何处放置“隐式无”

    我需要放implicit none在每个函数和子程序中 或者将其放在包含这些函数和子例程的模块的开头就足够了吗 或者将其放在使用这些模块的程序的开头就足够了吗 通过观察别人的工作代码 implicit none包含在所有这些地方 我不确定这
  • React Hooks 的 Keydown/up 事件无法正常工作

    我正在尝试为我正在开发的游戏创建基于箭头的键盘控件 当然 我想跟上 React 的最新动态 所以我想创建一个函数组件并使用钩子 我创建了一个JSFiddle对于我的越野车组件 它几乎按预期工作 除非我同时按下很多箭头键 然后好像有一些key
  • 在 tidyr/dplyr 中添加零计数行的正确习惯用法

    假设我有一些如下所示的计数数据 library tidyr library dplyr X raw lt data frame x as factor c A A A B B B y as factor c i ii ii i i i z
  • Java 和无符号值

    我正在解析 DatagramSocket 中的无符号位 我总共有 24 位 或 3 个字节 进来 它们是 1 个无符号 8 位整数 后跟一个 16 位有符号整数 但是java从来不会将除了有符号字节之外的任何东西存储到字节 字节数组中 当j
  • 无法刷新hangfire仪表板中的统计信息

    我的网站在同一台服务器上使用hangfire 运行 Hangfire 仪表板在本地运行良好 但是 当我访问http localhost hangfire recurring在服务器计算机上 它报告此错误 Unable to refresh
  • bash文本搜索:查找一个文件的内容是否存在于另一个文件中[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 假设我们有两个文件 a txt 和 b txt 每个文件都有多行文本 如何编写一个shell脚本来检查b txt中是否存在a txt的所有内容 感谢各位的提示 我没有注意到 q
  • 将 3 字节立体声 WAV 文件转换为 numpy 数组

    我收到了一个连续水下录音的大型 WAV 文件 我想将其转换为 numpy 数组进行分析 我正在努力做到这一点 到目前为止我有 import numpy as np import scipy as sp import wave as wv i
  • 从 VB.NET 编码过渡到 C# 的好练习吗?

    中级 高级 VB NET Web 程序员应该做哪些练习来掌握 C 语法 我想一些很好的例子是 运行全部 C 语法的算法或项目练习 参考资料 VB NET 程序员应注意的主要语法差异列表 我认为最好的锻炼就是为自己创造一些东西 通过这种方式
  • 是否有任何 Python IDE 可以像 R 一样让您运行选定的代码? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我认为这对于初学者来说是一
  • 在 Swift 中,为什么子类方法不能覆盖超类中协议扩展提供的方法

    我知道这个问题的标题很令人困惑 但奇怪的行为在下面的示例中进行了解释 protocol Protocol func method gt String extension Protocol func method gt String retu
  • BadImageFormatException 调试以 x64 模式运行的网站

    这个论坛里有很多关于这个的问题BadImageFormatException 但没有一个完全符合我的问题 我有一个包含多个项目的解决方案 当我在 调试 或 发布 任何 CPU 中运行时 一切正常 然而 当我切换到 x64 并运行我的 ASP
  • 运行 AspectJ 会导致 NoSuchMethodError: Aspect.aspectOf

    我有一个非常简单的 AspectJ 方面 使用 AspectJ 它只打印出一条日志消息 我的目标是在我的 Android 应用程序中提供建议代码 现在 只要我的应用程序源代码中有方面类本身 这个方面就可以完美地工作 一旦我将方面移动到不同的