如何使用Java反射获取javax.xml.ws.Holder中的实际类型?

时间:2015-04-07 15:58:55

标签: java reflection wsimport

我想做以下。
1)我在WSDL上运行wsimport来生成Java代码 2)wsimport生成一个代表WSDL接口的Java接口 3)我想使用反射来发现接口中方法的参数类和返回类型
下面显示的是wsimport生成的接口。

public interface Sample2 {
@WebMethod(action = "http://www.example.org/sample2/getMeaning2")
public void getMeaning2(
    @WebParam(name = "getMeaning21", targetNamespace = "http://www.example.org/sample2/", partName = "parameters1")
    GetMeaning21 parameters1,
    @WebParam(name = "getMeaning2", targetNamespace = "http://www.example.org/sample2/", partName = "parameters2")
    GetMeaning2 parameters2,
    @WebParam(name = "getMeaningResponse21", targetNamespace = "http://www.example.org/sample2/", mode = WebParam.Mode.OUT, partName = "parameters3")
    Holder<GetMeaningResponse21> parameters3,
    @WebParam(name = "getMeaningResponse2", targetNamespace = "http://www.example.org/sample2/", mode = WebParam.Mode.OUT, partName = "parameters4")
    Holder<GetMeaningResponse2> parameters4);
}

我的问题是针对方法getMeaning2的第二个和第三个参数。 我能够使用反射api获取方法的参数。 Method.getParameterTypes(注意这实际上是一个实例方法)。

Method declaredMethods[] = Sample2.class.getDeclaredMethods();
method = declaredMethods[0];
Class<?>[] parameterTypes = method.getParameterTypes();

数组的第二个和第三个元素的类型为javax.xml.ws.Holder类。

我的问题是如何从parameters3和parameters4获取实际类型(在本例中为GetMeaningResponse21.class和GetMeaningResponse2.class)?

1 个答案:

答案 0 :(得分:0)

我找到了一种获取 Holder 类中值的实际类型的方法。

Type[] genericParameterTypes = method.getGenericParameterTypes();
String typeName = ((ParameterizedType)genericParameterTypes[2]).getActualTypeArguments()[0].toString();
typeName = typeName.substring("class ".length());
Class<?> actualParamClass = Class.forName(typeName);

actualParamClass Holder 类持有的实际类型的 Class