Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java自定义注释,以在调用带注释的方法之前调用其他方法_Java_Annotations_Aop_Aspectj_Interceptor - Fatal编程技术网

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

Java自定义注释,以在调用带注释的方法之前调用其他方法,java,annotations,aop,aspectj,interceptor,Java,Annotations,Aop,Aspectj,Interceptor,我正在尝试实现一个自定义注释,它看起来像: public class Foo{ @CustomAnnotation(classname="com.somepackage.ExternalClass", methodname="method1", invokation="before") public void bar(){ //method body.. } } 应在调用实际方法之前调用注释中指定的方法。 请建议如何实现这一点。您在这里想要实现什么?为什么不直接从方法体内部调用该方法

我正在尝试实现一个自定义注释,它看起来像:

public class Foo{

@CustomAnnotation(classname="com.somepackage.ExternalClass", methodname="method1", invokation="before")
public void bar(){
  //method body..
  }
}
应在调用实际方法之前调用注释中指定的方法。
请建议如何实现这一点。

您在这里想要实现什么?为什么不直接从方法体内部调用该方法

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

为此,您可以做的唯一一件事是,如果您仅从单个位置调用该方法,则可以使用反射来检查该注释并调用该方法(同样,使用反射来调用该方法),类似于JUnit的工作方式(使用@Test和@Before/@After注释)。

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

公共方面CustomAnnotationAspect{
切入点customAnnotationPointcut(对象t,CustomAnnotationValue):执行(@CustomAnnotation**.*.*(..)&&&this(annotationValue)&&target(t);
before(对象目标,CustomAnnotation annotationValue):customAnnotationPointcut(目标,annotationValue){
字符串className=annotationValue.className();
String methodName=annotationValue.methodName();
//为className.methodName()调用执行一些反射操作
}
}

IMO您在这里所做的没有多大意义。您正在尝试重新实现通过AOP可以更轻松地完成的事情。但是,如果您使用AOP,为什么会用有关如何应用交叉关注点的信息污染您的主要应用程序代码?一个干净的解决方案是将这些信息完全外部化到如果你想看一个简单的AspectJ例子来说明我所说的,请告诉我。