如果该参数上存在注释,是否可以获取参数的值?
给定带参数级注释的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
}
答案 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)
}
}