我正在尝试实现一个类似于:
的自定义注释public class Foo{
@CustomAnnotation(classname="com.somepackage.ExternalClass", methodname="method1", invokation="before")
public void bar(){
//method body..
}
}
应在调用实际方法之前调用注释中指定的方法。 请建议如何实现这一目标。
答案 0 :(得分:1)
你想在这里完成什么?为什么不从方法体内调用方法?
注释在编译期间处理,并在运行时期间可用(如果它们的生命周期设置为运行时)。它们可用于在编译时生成代码或影响其他代码处理类的方式,但是您无法在注释处理期间更改现有类。
你唯一可以做的就是如果你只从一个位置调用该方法,你可以使用反射来检查该注释并调用该方法(再次,使用反射来调用方法),类似于JUnit如何工作(使用@Test和@ Before / @注释后)。
答案 1 :(得分:0)
您可以使用AOP(AspectJ或Spring或Spring + AspectJ)来完成此操作。唯一可能存在问题的是invokation="before"
注释参数,因为before
,after
,around
等是在您方面硬编码的建议。
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
}
}