如何在执行带注释的方法之前调用外部方法并传递参数

时间:2014-06-12 08:54:59

标签: java annotations aop pojo

我正在研究使用Maven构建到独立JAR中的POJO项目。为了可维护性,我正在考虑添加一种使用基于注释的检查的方法。在下面的代码中我有一个带注释的方法,在调用此方法的事件中,我希望另一个类中的另一个方法被执行并且是上下文感知的,所以我可以访问传递给原始方法的参数。

public class SomeClass {
    public static void someClassMethod(){

        ...

        get(new AnotherClass() {
            @CustomAnnotation
            public Object handle(ArgumentClass1 arg1, ArgumentClass2 arg2) {
                ...
            }
        });

        ...

    }
}

我知道这可以通过AspectJ来完成,但我找不到如何实现这些功能的真实工作示例。所以我想问一个示例代码,或指向工作示例的链接。

1 个答案:

答案 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