Чтобы динамически вызвать функции на экземпляр MATLAB® Production Server™, вы используете основанного на отражении прокси создать запрос функции MATLAB. Имя функции и все вводы и выводы передаются как параметры методу, вызывающему запрос. Это означает, что вы не должны перекомпилировать свое приложение каждый раз, когда вы добавляете функцию в развернутый архив.
Динамически вызвать функцию MATLAB:
Инстанцируйте экземпляра класса MWHttpClient
.
Создайте основанный на отражении объект прокси с помощью одного из методов createComponentProxy()
клиентской связи.
Вызовите функцию с помощью одного из методов invoke()
основанного на отражении прокси.
Основанный на отражении прокси реализует интерфейс MWInvokable
и предоставляет методы, который позволяет вам непосредственно вызвать любую функцию MATLAB в развертываемом архиве. Как с основанным на интерфейсе прокси, основанный на отражении прокси создается из клиентского объекта связи. Класс MWHttpClient
имеет два метода для создания основанного на отражении прокси:
MWInvokable createComponentProxy(URL archiveURL)
создает прокси, который использует стандартные типы данных MATLAB.
MWInvokable createComponentProxy(URL archiveURL, MWMarshalingRules marshalingRules)
создает прокси, который использует структуры.
Создать основанного на отражении прокси для вызова функций в архиве myMagic
, размещенный на вашем локальном компьютере:
MWClient myClient = new MWHttpClient(); URL archiveURL = new URL("http://localhost:9910/myMagic"); MWInvokable myProxy = myClient.createComponentProxy(archiveURL);
Основанный на отражении прокси имеет три метода для вызова функций на сервере:
Object[] invoke(final String functionName, final int nargout, final Class<T> targetType, final Object... inputs)
вызывает функцию, которая возвращает значения nargout
.
<T> T invoke(final String functionName, final Class<T> targetType, final Object... inputs)
вызывает функции, который возвращает одно значение.
invokeVoid(final String functionName, final Object... inputs)
вызывает функцию, которая не возвращает значений.
Все методы сопоставляют с функцией MATLAB можно следующим образом:
Первый аргумент является именем функции
Средний набор аргументов, nargout
и targetType
, представляет возвращаемые значения функции
Последние аргументы являются входными параметрами функции
Функция MATLAB myLimits
возвращает два значения.
function [myMin,myMax] = myLimits(myRange) myMin = min(myRange); myMax = max(myRange); end
Чтобы вызвать myLimits
от клиента Java®, используйте метод invoke()
, который берет количество возвращаемых аргументов:
double[] myRange = new double[]{2,5,7,100,0.5}; try { Object[] myLimits = myProxy.invoke("myLimits", 2, Object[].class, myRange); double myMin = ((Double) myLimits[0]).doubleValue(); double myMax = ((Double) myLimits[1]).doubleValue(); System.out.printf("min: %f max: %f",myMin,myMax); } catch (Throwable e) { e.printStackTrace(); }
Поскольку Java не может определить соответствующие типы для каждого из возвращенных значений, эта форма invoke
всегда возвращает Object[]
и всегда берет Object[].class
в качестве целевого типа. Необходимо бросить возвращенные значения в соответствующие типы.
Функция MATLAB addmatrix
возвращает одно значение.
function a = addmatrix(a1, a2)
a = a1 + a2;
Чтобы вызвать addmatrix
от клиента Java, используйте метод invoke()
, который не берет количество возвращаемых аргументов:
double[][] a1={{1,2,3},{3,2,1}}; double[][] a2={{4,5,6},{6,5,4}}; try { Double[][] result = myProxy.invoke("addmatrix", Double[][].class, a1, a2); for(Double[] row : result) { for(double element : row) { System.out.print(element + " "); } } } catch (Throwable e) { e.printStackTrace(); }
Функция MATLAB foo
не делает возвращаемого значения.
function foo(a1)
min(a1);
Чтобы вызвать foo
от клиента Java, используйте метод invokeVoid()
:
double[][] a={{1,2,3},{3,2,1}}; try { myProxy.invokeVoid("foo", (Object)a); } catch (Throwable e) { e.printStackTrace(); }
Если какая-либо функция MATLAB в развертываемом архиве использует структуры, необходимо предоставить правила маршалинга основанному на отражении прокси. Обеспечить маршалинг управляет к прокси:
Реализуйте новый набор маршалинга правил путем расширения интерфейса MWDefaultMarshalingRules
, чтобы использовать список упорядочиваемых классов.
Создайте прокси с помощью метода createComponentProxy(URL archiveURL, MWMarshalingRules marshalingRules)
.
Развертываемый studentChecker
архива включает функции, которые используют структуру MATLAB формы
S = name: 'Ed Plum' score: 83 grade: 'B+'
Клиентский код Java представляет структуру MATLAB с классом под названием Student
. Чтобы создать правило маршалинга для того, чтобы динамически вызвать функции в studentChecker
, создайте класс под названием studentMarshaller
.
class studentMarshaller extends MWDefaultMarshalingRules { public List<Class> getStructTypes() { List structType = new ArrayList<Class>(); structType.add(Student.class); return structType; } }
Создайте прокси для studentChecker
путем передачи studentMarshaller
createComponentProxy()
.
URL archiveURL = new URL("http://localhost:9910/studentCheck"); myProxy = myClient.createComponentProxy(archiveURL, new StudentMarshaller());
Для получения дополнительной информации об использовании структур MATLAB смотрите Маршала Структуры MATLAB (Структуры) на Java.