【问题标题】: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
这就是你想要的,不是吗?