#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);
...