MWJavaObjectRef
, специальный подкласс MWArray
, может использоваться для создания MATLAB® массив, который ссылается на Java® объекты. Подробную информацию об использовании этого класса, конструктора и связанных методов см. в MWJavaObjectRef
страница в Javadoc или поиск MWJavaObjectRef
в поле MATLAB Help browser Search.
Найти Javadoc можно по адресу
в установке вашего продукта.matlabroot
/ help/javabuilder/MWArrayAPI
Можно создать оболочку кода MATLAB вокруг объектов Java с помощью MWJavaObjectRef
. Используя этот метод, можно передавать объекты по ссылке на функции MATLAB, клонировать объект Java внутри сгенерированного пакета, а также выполнять другое маршалирование объектов, характерное для SDK™ продукта MATLAB Compiler. Примеры в этом разделе представляют некоторые общие примеры использования.
Чтобы передать объект в метод MATLAB Compiler SDK Java:
Использование MWJavaObjectRef
для переноса объекта.
Передайте ваш объект в функцию MATLAB. Для примера:
/* Create an object */ java.util.Hashtable<String,Integer> hash = new java.util.Hashtable<String,Integer>(); hash.put("One", 1); hash.put("Two", 2); System.out.println("hash: "); System.out.println(hash.toString()); /* Create a MWJavaObjectRef to wrap this object */ origRef = new MWJavaObjectRef(hash); /* Pass it to a MATLAB function that lists its methods, etc */ result = theComponent.displayObj(1, origRef); MWArray.disposeArray(origRef);
Можно также использовать MWJavaObjectRef
для клонирования объекта. Продолжая пример с передачей Java- Объект в метод MATLAB Compiler SDK Java Method, выполните следующее:
Добавить к исходному хэшу.
Клонирование объекта.
(Необязательно) Продолжить добавление элементов в каждый копий. например:
origRef = new MWJavaObjectRef(hash); System.out.println("hash:"); System.out.println(hash.toString()); result = theComponent.addToHash(1, origRef); outputRef = (MWJavaObjectRef)result[0]; /* We can typecheck that the reference contains a */ /* Hashtable but not <String,Integer>; */ /* this can cause issues if we get a Hashtable<wrong,wrong>. */ java.util.Hashtable<String, Integer> outHash = (java.util.Hashtable<String,Integer>)(outputRef.get()); /* We've added items to the original hash, cloned it, */ /* then added items to each copy */ System.out.println("hash:"); System.out.println(hash.toString()); System.out.println("outHash:"); System.out.println(outHash.toString());
Для ссылки, вот исходный код для addToHash.m
:
addToHash.m
function h2 = addToHash(h) % Validate input if ~isa(h,'java.util.Hashtable') error('addToHash:IncorrectType', ... 'addToHash expects a java.util.Hashtable'); end % Add an item h.put('From MATLAB',12); % Clone the Hashtable and add items to both resulting objects h2 = h.clone(); h.put('Orig',20); h2.put('Clone',21);
В сложение передачи созданных объектов, как и в Передаче объекта Java в MATLAB Compiler SDK Java Method, можно также использовать MWJavaObjectRef
для прохождения в Java объектов утилиты, таких как java.util.date
. Для этого выполните следующие шаги:
Получите текущую дату и время с помощью объекта Java java.util.date
.
Создайте образец MWJavaObjectRef
в котором можно перенести объект Java.
Передайте его в функцию MATLAB, которая выполняет дальнейшую обработку, такую как nextWeek.m
. Для примера:
/* Get the current date and time */ java.util.Date nowDate = new java.util.Date(); System.out.println("nowDate:"); System.out.println(nowDate.toString()); /* Create a MWJavaObjectRef to wrap this object */ origRef = new MWJavaObjectRef(nowDate); /* Pass it to a MATLAB function that calculates one week */ /* in the future */ result = theComponent.nextWeek(1, origRef); outputRef = (MWJavaObjectRef)result[0]; java.util.Date nextWeekDate = (java.util.Date)outputRef.get(); System.out.println("nextWeekDate:"); System.out.println(nextWeekDate.toString());
nextWeek.m
:
nextWeek.m
function nextWeekDate = nextWeek(nowDate) % Validate input if ~isa(nowDate,'java.util.Date') error('nextWeekDate:IncorrectType', ... 'nextWeekDate expects a java.util.Date'); end % Use java.util.Calendar to calculate one week later % than the supplied % java.util.Date cal = java.util.Calendar.getInstance(); cal.setTime(nowDate); cal.add(java.util.Calendar.DAY_OF_MONTH, 7); nextWeekDate = cal.getTime();
Если вы хотите, чтобы фактические объекты Java были возвращены из метода (без обертывания MATLAB), используйте unwrapJavaObjectRefs
.
Этот метод рекурсивно соединяет одну MWJavaObjectRef
или многомерный массив MWJavaObjectRef
объекты на ссылку или массив ссылок.
Следующие фрагменты кода показывают два примера вызова unwrapJavaObjectRefs
:
Возврат одной ссылки или ссылки на массив объектов с unwrapJavaObjectRefs
Hashtable<String,Integer> myHash = new Hashtable<String,Integer>(); myHash.put("a", new Integer(3)); myHash.put("b", new Integer(5)); MWJavaObjectRef A = new MWJavaObjectRef(new Integer(12)); System.out.println("A referenced the object: " + MWJavaObjectRef.unwrapJavaObjectRefs(A)); MWJavaObjectRef B = new MWJavaObjectRef(myHash); Object bObj = (Object)B; System.out.println("B referenced the object: " + MWJavaObjectRef.unwrapJavaObjectRefs(bObj))
Формирует следующий выход:
A referenced the object: 12 B referenced the object: {b=5, a=3}
Возврат массива ссылок с unwrapJavaObjectRefs
MWJavaObjectRef A = new MWJavaObjectRef(new Integer(12)); MWJavaObjectRef B = new MWJavaObjectRef(new Integer(104)); Object[] refArr = new Object[2]; refArr[0] = A; refArr[1] = B; Object[] objArr = MWJavaObjectRef.unwrapJavaObjectRefs(refArr); System.out.println("refArr referenced the objects: " + objArr[0] + " and " + objArr[1]);
Формирует следующий выход:
refArr referenced the objects: 12 and 104
Полный пример того, как использовать MWJavaObjectRef
чтобы создать ссылку на объект Java и передать его в метод, смотрите Передайте объекты Java в MATLAB.