exponenta event banner

Передача объектов Java по ссылке

Массив MATLAB

MWJavaObjectRef, специальный подкласс MWArray, может использоваться для создания массива MATLAB ®, который ссылается на объекты Java ®. Подробные сведения об использовании этого класса, конструктора и связанных методов см. в разделе MWJavaObjectRef страница в Javadoc или поиск MWJavaObjectRef в поле Поиск в браузере справки MATLAB.

Вы можете найти Javadoc по адресу matlabroot/help/javabuilder/MWArrayAPI в установке продукта.

Перенос и передача объектов в MATLAB

Можно создать оболочку кода MATLAB вокруг объектов Java с помощью MWJavaObjectRef. С помощью этого метода можно передавать объекты по ссылкам на функции MATLAB, клонировать объект Java внутри сгенерированного пакета, а также выполнять другие маршалинги объектов, специфичные для продукта SDK™ компилятора MATLAB. Примеры, приведенные в этом разделе, содержат некоторые распространенные примеры использования.

Передача объекта Java в метод Java SDK компилятора MATLAB

Чтобы передать объект в Java-метод SDK компилятора MATLAB, выполните следующие действия.

  1. Использовать MWJavaObjectRef для обтекания объекта.

  2. Передайте объект функции 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-объекта в Java-метод SDK компилятора MATLAB, выполните следующие действия.

  1. Добавить к исходному хэшу.

  2. Клонируйте объект.

  3. (Необязательно) Продолжить добавление элементов к каждой копии. Например:

                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 в метод Java компилятора MATLAB SDK, можно также использовать MWJavaObjectRef для передачи в объектах утилиты Java, таких как java.util.date. Для этого выполните следующие шаги:

  1. Получение текущей даты и времени с помощью объекта Java java.util.date.

  2. Создание экземпляра MWJavaObjectRef в который переносится объект Java.

  3. Передача функции 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 с помощью unrapJavaObjectRefs

При необходимости возврата фактических объектов Java из метода (без обертки MATLAB) используйте unwrapJavaObjectRefs.

Этот метод рекурсивно соединяет один MWJavaObjectRef или многомерный массив MWJavaObjectRef объектов для ссылки или массива ссылок.

Следующие фрагменты кода показывают два примера вызова unwrapJavaObjectRefs:

Возврат одиночной ссылки или ссылки на массив объектов с unrapJavaObjectRefs

             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}

Возврат массива ссылок с unrapJavaObjectRefs

             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

Полный пример использования MWJavaObjectRef для создания ссылки на объект Java и передачи ее методу см. раздел Передача объектов Java в MATLAB.