Java自定义注释,用于在调用带注释的方法之前调用其他方法

时间:2016-09-22 07:40:16

标签: java annotations aop aspectj interceptor

我正在尝试实现一个类似于:

的自定义注释
public class Foo{

@CustomAnnotation(classname="com.somepackage.ExternalClass", methodname="method1", invokation="before")
public void bar(){
  //method body..
  }
}

应在调用实际方法之前调用注释中指定的方法。 请建议如何实现这一目标。

2 个答案:

答案 0 :(得分:1)

你想在这里完成什么?为什么不从方法体内调用方法?

注释在编译期间处理,并在运行时期间可用(如果它们的生命周期设置为运行时)。它们可用于在编译时生成代码或影响其他代码处理类的方式,但是您无法在注释处理期间更改现有类。

你唯一可以做的就是如果你只从一个位置调用该方法,你可以使用反射来检查该注释并调用该方法(再次,使用反射来调用方法),类似于JUnit如何工作(使用@Test和@ Before / @注释后)。

答案 1 :(得分:0)

您可以使用AOP(AspectJ或Spring或Spring + AspectJ)来完成此操作。唯一可能存在问题的是invokation="before"注释参数,因为beforeafteraround等是在您方面硬编码的建议。 AspectJ代码示例如下:

public aspect CustomAnnotationAspect {

    pointcut customAnnotationPointcut(Object t, CustomAnnotation annotationValue): execution(@CustomAnnotation * *.*(..)) &&  @this(annotationValue) && target(t);

    before(Object target, CustomAnnotation annotationValue): customAnnotationPointcut(target, annotationValue) {
        String className = annotationValue.className();
        String methodName = annotationValue.methodName();
        //do some reflection staff for className.methodName() invocation
    }

}