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

@WebParam on a parameter of interface method - how to get name?

我尝试获取接口方法中方法参数 User user 上注释 @WebParam 的名称 "best_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
        )
}

这不是接口类型的限制。

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

类型的参数

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

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

因为Java8,你也可以使用Method#getParameters() and Parameter#getAnnotation()

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