我真的无法向您解释 AOP 基础知识。如果您不愿意至少阅读 AOP 教程并掌握诸如切面、连接点、切入点和建议等基本概念,就要求人们提供示例代码,这是错误的地方。我什至会在 AspectJ 中为您提供一个功能齐全的示例(见下文),但有什么用呢?你还会明白吗?我不打算提供 Maven 配置,因为这确实超出了范围,即使我确实知道如何使用 Maven 构建 AspectJ 代码。随意使用搜索引擎学习,然后返回具体问题,而不是“我懒得学习,请为我做”。
根据您的示例的参数类:
package de.scrum_master.app;
public class ArgumentClass1 {}
--
package de.scrum_master.app;
public class ArgumentClass2 {}
示例注释:
package de.scrum_master.app;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {}
根据您的样本抽象类:
package de.scrum_master.app;
public abstract class AnotherClass {
public abstract Object handle(ArgumentClass1 arg1, ArgumentClass2 arg2);
}
带有一些示例方法的应用程序类:
package de.scrum_master.app;
public class SomeClass {
public static void someClassMethod() {
get(new AnotherClass() {
@CustomAnnotation
public Object handle(ArgumentClass1 arg1, ArgumentClass2 arg2) {
return "dummy";
}
});
}
public static Object get(AnotherClass anotherClass) {
return anotherClass.handle(new ArgumentClass1(), new ArgumentClass2());
}
private static void anotherClassMethod(String string, String string2) {}
@CustomAnnotation
private static void yetAnotherClassMethod(int i, int j) {}
public static void main(String[] args) {
someClassMethod();
anotherClassMethod("foo", "bar");
yetAnotherClassMethod(11, 22);
}
}
如您所见,有一些静态方法,部分是公共/私有的,其中一个由 @CustomAnnotation 注释,而另一些则不是,一个包含一个匿名类,从上面具体化抽象类,还包含一个由注释的方法@CustomAnnotation。我们应该期望 yetAnotherClassMethod(int, int) 和 handle(ArgumentClass1, ArgumentClass2) 被切面拦截,因为它们带有我们的目标注解。
最后,但同样重要的是,...
带有我们自定义注解的切面拦截方法:
package de.scrum_master.aspect;
import de.scrum_master.app.CustomAnnotation;
public aspect AnnotatedMethodInterceptor {
Object around() : execution(@CustomAnnotation * *(..)) {
System.out.println(thisJoinPoint);
for (Object arg : thisJoinPoint.getArgs()) {
System.out.println(" Checking argument " + arg);
}
return proceed();
}
}
我没有检查示例中的参数,而是循环遍历参数数组以打印它们。不过,您可以在这里做任何您想做的事情。
现在请弄清楚 AOP 和 AspectJ 语法是什么。那里有足够的教程,只需使用您喜欢的搜索引擎或从http://www.eclipse.org/aspectj/docs.php开始。
示例代码控制台输出:
execution(Object de.scrum_master.app.SomeClass.1.handle(ArgumentClass1, ArgumentClass2))
Checking argument de.scrum_master.app.ArgumentClass1@1bdf2b92
Checking argument de.scrum_master.app.ArgumentClass2@58a58c89
execution(void de.scrum_master.app.SomeClass.yetAnotherClassMethod(int, int))
Checking argument 11
Checking argument 22