Отражение Java — serviceCall

#java #reflection

#java #отражение

Вопрос:

Я хочу вызвать веб-сервис с отражением, потому что я генерирую все файлы веб-сервиса динамически во время выполнения.

Это оператор кода:

  List<ResultObject> resObject = transaction.executeServiceCall("webservicename", new String[] { "webserviceInput" }, new Object[] { serviceList }, ResultObject.class);
  

Объявление входных параметров:

     Object resultObject = "com.test.ResultObject"; 
    String webservicename = "webservicename"; // from the choosen Webservice
    String webserviceinput = "webserviceInput; // from the choosen Webservice
   List<WebserviceInputObject> siList = new ArrayList<WebserviceInputObject>();
  

Как я могу динамически вызывать executeServiceCall с заданными параметрами?

Второй вопрос заключается в том, как реализовать эту конструкцию с отражением:

  List<WebserviceInputObject> siList = new ArrayList<WebserviceInputObject>()
  

WebserviceInputObject — это объект, который также должен быть загружен отражением Java

Ответ №1:

Для вызова

 Class[] argTypes = { String.class, String[].class, Object[].class, Class.class };
Method method = transaction.getClass().getMethod("executeServiceCall", argTypes);
Object[] args = { resultObject, webservicename, webserviceinput, siList  };
List<ResultObject> resObject = (List) method.invoke(transaction, args);
  

Для создания WebserviceInputObject

 WebserviceInputObject instance = WebserviceInputObject.class.newInstance();
Method nameSetter = WebserviceInputObject.class.getMethod("setName", String.class);
// use xDeclaredY methods for private methods/fields
Field typeField = WebserviceInputObject.class.getDeclaredField("type");
typeField.setAccessible(true); // make private field settable
nameSetter.invoke(instance, "foo");
typeField.set(instance, 666);
...