关于接口方法参数的@WebParam - 如何获取名称?

时间:2015-03-11 21:20:40

标签: java reflection annotations

我尝试在接口方法中的方法参数"best_user"上获取注释@WebParam的名称User user。因为它是一个接口,所以下面的代码不允许我访问注释:

String methodName = "doSomething";

Class<?> clazz = Class.forName(packageName + "." + "UserService");

Method serviceMethod = null;

for (Method method: clazz.getMethods())
{
    if (method.getName().equals(methodName))
    {
        serviceMethod = method;
        break;
    }
}

Class<?>[] parameterTypes = serviceMethod.getParameterTypes();
WebParam webParam = parameterTypes[0].getAnnotation(WebParam.class); //webParam is null
String parameterName = webParam.name();

然而,Web服务框架能够获取此数据。我怎么能这样做呢?

接口:

@WebService(name = "UserService", targetNamespace = "my.targetNamespace")
public interface UserService {
    @WebMethod
    public String doSomething
        (
            @WebParam(name = "best_user")
            User user
        )
}

1 个答案:

答案 0 :(得分:2)

这不是接口类型的限制。

Method#getParameterTypes()返回一组参数类型。在您的示例中,它只包含User.class,因为您的方法有一个User类型的参数。

您需要使用Method#getParameterAnnotations()并获取第一个参数的第一个注释。

Annotation[][] parameterTypes = serviceMethod.getParameterAnnotations();
WebParam webParam = (WebParam) parameterTypes[0][0];

从Java 8开始,您还可以使用Method#getParameters()Parameter#getAnnotation()

WebParam webParam = serviceMethod.getParameters()[0].getAnnotation(WebParam.class);