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

Массив MATLAB

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

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

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

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

Передача объекта Java в метод MATLAB Compiler SDK Java

Чтобы передать объект в метод MATLAB Compiler SDK Java:

  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- Объект в метод MATLAB Compiler SDK Java Method, выполните следующее:

  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 в MATLAB Compiler SDK Java Method, можно также использовать 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 с использованием unwrapJavaObjectRefs

Если вы хотите, чтобы фактические объекты 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

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