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

时间:2013-08-08 14:55:55

标签: java reflection annotations ejb interceptor

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

给定带参数级注释的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
}

3 个答案:

答案 0 :(得分:5)

doIntercept()中,您可以从InvocationContext检索被调用的方法并获取parameter annotations

Method method = context.getMethod();
Annotation[][] annotations = method.getParameterAnnotations();
// iterate through annotations and check 
Object[] parameterValues = context.getParameters();

// check if annotation exists at each index
if (annotation[0].length > 0 /* and if the annotation is the type you want */ ) 
    // get the value of the parameter
    System.out.println(parameterValues[0]);

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

答案 1 :(得分:2)

你可以尝试这样的东西,我定义了一个名为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());
    }
  }
}

答案 2 :(得分:1)

您可以尝试这样的事情

    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)
        }
    }