如果参数注释存在,则获取参数值



如果参数上存在注释,是否可以获取该参数的值?

给定带有参数级注释的EJB:

public void fooBar(@Foo String a, String b, @Foo String c) {...}

还有一个拦截器:

@AroundInvoke
public Object doIntercept(InvocationContext context) throws Exception {
    // Get value of parameters that have annotation @Foo
}

doIntercept()中,您可以从InvocationContext检索正在调用的方法并获取参数注释。

Method method = context.getMethod();
Annotation[][] annotations = method.getParameterAnnotations();
Object[] parameterValues = context.getParameters();
// then iterate through parameters and check if annotation exists at each index, example with first parameter at index 0:
if (annotations[0].length > 0 /* and add check if the annotation is the type you want */) 
    // get the value of the parameter
    System.out.println(parameterValues[0]);

因为如果没有Annotations,Annotation[][]会返回一个空的二维数组,所以您知道哪些参数位置有Annotation。然后,您可以调用InvocationContext#getParameters()来获得一个包含所有传递参数值的Object[]。此阵列的大小与Annotation[][]的大小相同。只需返回没有注释的索引的值。

您可以尝试这样的操作,我定义了一个名为MyAnnotation的Param注释,并通过这种方式获得Param注释。它有效。

Annotation[][] parameterAnnotations = method.getParameterAnnotations();
Class[] parameterTypes = method.getParameterTypes();
int i=0;
for(Annotation[] annotations : parameterAnnotations){
  Class parameterType = parameterTypes[i++];
  for(Annotation annotation : annotations){
    if(annotation instanceof MyAnnotation){
        MyAnnotation myAnnotation = (MyAnnotation) annotation;
        System.out.println("param: " + parameterType.getName());
        System.out.println("value: " + myAnnotation.value());
    }
  }
}

您可以尝试类似的

    Method m = context.getMethod();
    Object[] params = context.getParameters();
    Annotation[][] a = m.getParameterAnnotations();
    for(int i = 0; i < a.length; i++) {
        if (a[i].length > 0) {
            // this param has annotation(s)
        }
    }

相关内容

  • 没有找到相关文章

最新更新