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

Массив MATLAB

MWJavaObjectRef, специальный подкласс MWArray, может использоваться, чтобы создать массив MATLAB®, это ссылается на объекты Java®. Для подробной информации об использовании об этом классе конструктор и сопоставленные методы, видят the MWJavaObjectRef страницу в Javadoc или ищут MWJavaObjectRef в поле Search Браузера документации MATLAB.

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

Перенесите и передайте объекты MATLAB

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

Передача объекта 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, сделайте следующее:

  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, можно также использовать 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 wrappering), используйте 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.