我正在研究使用Maven
构建到独立JAR中的POJO项目。为了可维护性,我正在考虑添加一种使用基于注释的检查的方法。在下面的代码中我有一个带注释的方法,在调用此方法的事件中,我希望另一个类中的另一个方法被执行并且是上下文感知的,所以我可以访问传递给原始方法的参数。
public class SomeClass {
public static void someClassMethod(){
...
get(new AnotherClass() {
@CustomAnnotation
public Object handle(ArgumentClass1 arg1, ArgumentClass2 arg2) {
...
}
});
...
}
}
我知道这可以通过AspectJ来完成,但我找不到如何实现这些功能的真实工作示例。所以我想问一个示例代码,或指向工作示例的链接。
答案 0 :(得分:0)
我真的无法向你解释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)
被一个方面拦截,因为它们带有我们的目标注释。
最后,但并非最不重要,......
带有我们自定义注释的Aspect拦截方法:
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