我正在使用以下示例代码来了解AspectJ:
public class Account {
int balance = 20;
public boolean withdraw(int amount) {
if (balance < amount) {
return false;
}
balance = balance - amount;
return true;
}
public static void main(String[] args) {
Account acc = new Account();
acc.withdraw(5);
Account acc2 = new Account();
acc2.withdraw(25);
}
}
以及以下方面:
public aspect AccountAspect {
pointcut callWithDraw(int amount, Account acc) :
call(boolean Account.withdraw(int)) && args(amount) && target(acc);
before(int amount, Account acc) : callWithDraw(amount, acc) {
System.out.printf("[before] withDraw, current balance %d%n", acc.balance);
}
boolean around(int amount, Account acc) : callWithDraw(amount, acc) {
if (acc.balance < amount) {
System.out.println("[around] withDraw, check failed");
return false;
}
System.out.println("[around] withDraw, check success");
return proceed(amount, acc);
}
after(int amount, Account acc) : callWithDraw(amount, acc) {
System.out.printf("[after] withDraw, current balance %d%n", acc.balance);
}
}
我正在使用以下Gradle构建文件:
plugins {
id 'java'
id "io.freefair.aspectj.post-compile-weaving" version "4.1.4"
}
configurations {
ajc
aspects
aspectCompile
compile{
extendsFrom aspects
}
}
group 'org.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation group: 'org.aspectj', name: 'aspectjrt', version: '1.9.4'
implementation group: 'org.aspectj', name: 'aspectjweaver', version: '1.9.4'
implementation group: 'org.codehaus.mojo', name: 'aspectj-maven-plugin', version: '1.8'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
compileJava {
sourceCompatibility = "1.8"
targetCompatibility = "1.8"
//The following two lines are useful if you have queryDSL if not ignore
dependsOn configurations.ajc.getTaskDependencyFromProjectDependency(true, "compileJava")
}
我正在Intellij中使用Ajc编译器来编译Java类和方面。此外,我正在设置以下虚拟机选项:
-javaagent:c:\\Users\\dev\\extlibs\\aspectjweaver-1.9.6.jar
代码可以编译并运行,没有任何问题,但是方面永远不会触发。我不确定我的配置中缺少什么,但是在使用AspectJ时我找不到其他可以做的事情。如果我使用@Aspect批注并在META-INF / aop.xml中注册带注释的方面,则该方面可以运行,但带注释的@Aspect Java类不允许创建需要捕获/拦截私有方法的特权方面。有关如何解决此问题的任何建议?
您在其中混合了很多东西:
-javaagent:
。我猜您可以使用所有三个选项,即编译时,后编译时和加载时编织,但是您应该决定选择哪一个而不要混合使用。您还应该决定是否要使用Gradle或Maven,也不要尝试将它们混合使用。
这是编译时编织的工作方式:
src/main/aspectj
。plugins {
id "java"
id "io.freefair.aspectj" version "5.1.1"
}
group "org.example"
version "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
dependencies {
implementation "org.aspectj:aspectjrt:1.9.6"
}
> Task :compileJava NO-SOURCE
> Task :compileAspectj UP-TO-DATE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :Account.main()
[before] withDraw, current balance 20
[around] withDraw, check success
[after] withDraw, current balance 15
[before] withDraw, current balance 20
[around] withDraw, check failed
[after] withDraw, current balance 20
当然,如果要将该方面库重新用于多个应用程序或模块,或者如果该应用程序源代码不是用Java编写的(例如,用Kotlin, Groovy或Scala),因此无法由AspectJ编译器直接编译。不过,我不在这里讨论这个问题,因为我想向您展示最简单的解决方案,因为您似乎是一个初学者。(顺便说一句,我也不是Gradle用户,我通常在Maven中使用AspectJ。)
更新:插件文档确实很糟糕,但是您可以在维护者的GitHub存储库中看到一些示例项目:
所有这些都可以使用Maven和AspectJ Maven插件来完成,但是您特别要求Gradle。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句