【问题标题】:AspectJ @DeclareMixin, Methods that are not declared by an interface are not weavedAspectJ @DeclareMixin,接口未声明的方法不会被编织
【发布时间】:2020-01-03 07:44:45
【问题描述】:

我正在尝试为 java.lang#Object 声明的方法提供默认实现。 这是我遇到的问题的MCVE。 在接口 IAspect 中,我声明了一个 equals 方法。 在这个类的实现中,我将它定义为总是假的。 所以理论上这个例子的主要方法应该输出假,但它输出真。 反编译该类时,该方法不存在。 我知道项目设置有效,因为接口 AspectJ 中的其他方法正确生成了所需的代码。 甚至可以使用注释来做到这一点吗?我通常使用 AspectJ-Syntax 编写我的 AspectJ 代码。 它按预期工作,没有任何缺陷。但是如果我使用 AspectJ-Syntax,我不确定是否能够在单独的库中提取 AspectJ 代码,例如在我的 MCVE 中。

所以我的实际问题:

  • 是否可以为从其他类继承的非抽象方法提供默认实现,而不是定义 Aspects 的接口?
  • 是否可以在库中使用 AspectJ-Syntax 并将此库添加为 AspecJ-Dependency 以便我的代码仍使用外部定义的方面?

根据答案,我将决定如何进一步进步。

【问题讨论】:

    标签: java maven aop aspectj aspectj-maven-plugin


    【解决方案1】:

    就像在我的answer to your previous question 中一样,我再次为您创建了一个pull request #2。它的作用:

    • 将您的注释样式方面转换为本机语法方面,内联声明接口及其方法实现,摆脱您以​​前的三个类。这是更优雅和可读的IMO。反正我不喜欢注解风格的语法,正如你已经发现的那样,后者有本机语法没有的限制。

    • 将两个独立的 Maven 模块重新构建为一个根/父 POM,用于配置常用的依赖项和插件,然后仅在两个子 POM 中根据需要使用其他配置详细信息进行引用和修改。库 POM 现在再次在其中包含 AspectJ Maven 插件,因为由于原生语法,我们还需要 AJ 编译器用于方面库。当然,您可以在库中使用本机语法方面,本模块将向您展示如何使用。

    • 另一个好处是,现在您只需在父 POM 上调用 mvn clean package,该库将在应用程序模块使用之前自动构建和打包。不再需要首先在库上使用mvn clean install。实际上,构建您的应用程序根本不需要install

    现在如果在mvn clean package 之后从根目录运行应用程序,您将看到以下内容:

    $ java -jar example/target/example-1.0.0-SNAPSHOT.one-jar.jar
    Test
    false
    false
    hello
    

    这就是你想要的,不是吗?

    【讨论】:

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