Чтобы динамически вызвать функции на экземпляр 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.