использование перечислений Java или общедоступных статических полей в MATLAB

никакое управление диалоговым окном, если Вы управляли диалоговым окном, Вы могли бы записать навязчивый код JavaScript. (Не хорошая идея использовать предупреждение для чего-либо кроме отладки)

5
задан Amro 7 November 2011 в 08:27
поделиться

3 ответа

Вы можете ссылаться на константы перечисления Java из Matlab используя синтаксис package.class.FIELD, как и любое другое статическое поле Java. Допустим, у вас есть перечисление.

package com.example;
public enum MyEnum {
    FOO, BAR, BAZ
}

Вы можете получить константы перечисления в Matlab, используя прямую ссылку. (Классы Java, конечно, должны находиться в пути javaclasspath Matlab.)

% Static reference
foo = com.example.MyEnum.FOO

% Import it if you want to omit the package name
import com.example.MyEnum;
foo = MyEnum.FOO
bar = MyEnum.BAR

Если вы хотите, чтобы "динамическая" ссылка определялась во время выполнения, вы можете просто создать строку, содержащую эквивалентную статическую ссылку, и передать ее eval (). Это работает практически с любым кодом Matlab.

% Dynamic reference
foo = eval('com.example.MyEnum.FOO')

И если вы хотите по-настоящему фантазировать, вы можете использовать отражение Java, чтобы получить все перечисленные константы во время выполнения. Создайте тонкую оболочку для других ваших пользовательских классов, чтобы обойти причуды загрузчика классов Matlab. (Нет эквивалента Matlab javaClass (); IMHO, это надзор за Matlab.)

//In Java
package com.example;
public class Reflector {
    public static Class forName(String className) throws Exception {
        return Class.forName(className);
    }
}

Затем вы можете перечислить константы в Matlab.

% Constant enumeration using reflection
klass = com.example.Reflector.forName('com.example.MyEnum');
enums = klass.getEnumConstants();
6
ответ дан 18 December 2019 в 06:51
поделиться

РЕДАКТИРОВАТЬ: Из здесь похоже, что обычный способ будет работать. Или Enums по какой-то причине отличается от других классов со статикой?

Можете ли вы вызвать Java-метод с параметрами?

SomeEnum e = com.example.test.SomeEnum.valueOf(SomeEnum.class, "MY_FAVORITE_ENUM")
3
ответ дан 18 December 2019 в 06:51
поделиться

Внутренние классы требуют преобразования в '.' в '$' в Matlab.

На самом деле это может быть связано с тем, как компилятор Java хранит внутренние объекты класса. Он ведет себя аналогичным образом для внутренних классов (например, javax.swing.plaf.basic.BasicTextUI $ UpdateHandler ). Matlab не так умен, как JVM, для автоматического преобразования этих внутренних "$" в ".". Следовательно, мы не можем использовать обычную простую точечную нотацию в этих случаях в Matlab, а поскольку '$' является недопустимым символом в синтаксисе Matlab, мы должны прибегать к использованию '$' в javaObject , javaMethod , awtinvoke и их родственники. Например:

Java: InnerClass c = new com.example.test.SomeEnum.InnerClass;
MATLAB: c = javaObject('com.example.test.SomeEnum$InnerClass')

Enums требует аналогичного преобразования '.' в '$' в Matlab. Но MATLAB ' s функция javaObject вызывает конструктор класса, и, поскольку перечисления не имеют конструктора, мы получаем следующую ошибку:

В классе Java не существует конструктора с соответствующей сигнатурой.

К счастью перечисление имеет встроенный метод valueOf () , который мы можем использовать с javaMethod :

Java: SomeEnum e = com.example.test.SomeEnum.MY_FAVORITE_ENUM;
MATLAB: e = javaMethod('valueOf','com.example.test$SomeEnum','MY_FAVORITE_ENUM');

Аналогично:

Java: int n = com.example.test.Foo.MAX_FOO;
MATLAB: n = javaMethod('com.example.test.Foo$MAX_FOO')

Статические поля можно получить непосредственно в Matlab, используя простую точечную нотацию:

redColor = java.awt.Color.red;

Полный список статических полей можно получить с помощью встроенной функции Matlab struct :

>> staticFields = struct(java.awt.Color.red)
staticFields = 
      white: [1x1 java.awt.Color]
      WHITE: [1x1 java.awt.Color]
  lightGray: [1x1 java.awt.Color]
 LIGHT_GRAY: [1x1 java.awt.Color]
       gray: [1x1 java.awt.Color]
       GRAY: [1x1 java.awt.Color]
   darkGray: [1x1 java.awt.Color]
  DARK_GRAY: [1x1 java.awt.Color]
      black: [1x1 java.awt.Color]
      BLACK: [1x1 java.awt.Color]
        red: [1x1 java.awt.Color]
        RED: [1x1 java.awt.Color]
       pink: [1x1 java.awt.Color]
       PINK: [1x1 java.awt.Color]
     orange: [1x1 java.awt.Color]
     ORANGE: [1x1 java.awt.Color]
     yellow: [1x1 java.awt.Color]
     YELLOW: [1x1 java.awt.Color]
      green: [1x1 java.awt.Color]
      GREEN: [1x1 java.awt.Color]
    magenta: [1x1 java.awt.Color]
    MAGENTA: [1x1 java.awt.Color]
       cyan: [1x1 java.awt.Color]
       CYAN: [1x1 java.awt.Color]
       blue: [1x1 java.awt.Color]
       BLUE: [1x1 java.awt.Color]
     OPAQUE: 1
    BITMASK: 2
TRANSLUCENT: 3

Функция MATLAB javaObject может не работать, если конструктор по умолчанию является закрытым (скрытым), и javaMethod , вероятно, тоже не сработает. Если класс со статическими методами вложен, возможно, вам не повезло. мы получаем следующую ошибку:

В классе Java не существует конструктора с подходящей подписью

К счастью, enum имеет встроенный метод valueOf () , который мы можем использовать с javaMethod :

Java: SomeEnum e = com.example.test.SomeEnum.MY_FAVORITE_ENUM;
MATLAB: e = javaMethod('valueOf','com.example.test$SomeEnum','MY_FAVORITE_ENUM');

Аналогично:

Java: int n = com.example.test.Foo.MAX_FOO;
MATLAB: n = javaMethod('com.example.test.Foo$MAX_FOO')

Статические поля могут быть получены непосредственно в Matlab с использованием простой точечной записи:

redColor = java.awt.Color.red;

Полный список статических полей может быть получен с помощью встроенной в Matlab функции struct :

>> staticFields = struct(java.awt.Color.red)
staticFields = 
      white: [1x1 java.awt.Color]
      WHITE: [1x1 java.awt.Color]
  lightGray: [1x1 java.awt.Color]
 LIGHT_GRAY: [1x1 java.awt.Color]
       gray: [1x1 java.awt.Color]
       GRAY: [1x1 java.awt.Color]
   darkGray: [1x1 java.awt.Color]
  DARK_GRAY: [1x1 java.awt.Color]
      black: [1x1 java.awt.Color]
      BLACK: [1x1 java.awt.Color]
        red: [1x1 java.awt.Color]
        RED: [1x1 java.awt.Color]
       pink: [1x1 java.awt.Color]
       PINK: [1x1 java.awt.Color]
     orange: [1x1 java.awt.Color]
     ORANGE: [1x1 java.awt.Color]
     yellow: [1x1 java.awt.Color]
     YELLOW: [1x1 java.awt.Color]
      green: [1x1 java.awt.Color]
      GREEN: [1x1 java.awt.Color]
    magenta: [1x1 java.awt.Color]
    MAGENTA: [1x1 java.awt.Color]
       cyan: [1x1 java.awt.Color]
       CYAN: [1x1 java.awt.Color]
       blue: [1x1 java.awt.Color]
       BLUE: [1x1 java.awt.Color]
     OPAQUE: 1
    BITMASK: 2
TRANSLUCENT: 3

Функция MATLAB javaObject может не работать, если конструктор по умолчанию является закрытым (скрытым), и javaMethod , вероятно, тоже не будет работать. Если класс со статическими методами вложен, возможно, вам не повезло. мы получаем следующую ошибку:

В Java-классе не существует конструктора с соответствующей подписью

К счастью, enum имеет встроенный метод valueOf () , который мы можем использовать с javaMethod :

Java: SomeEnum e = com.example.test.SomeEnum.MY_FAVORITE_ENUM;
MATLAB: e = javaMethod('valueOf','com.example.test$SomeEnum','MY_FAVORITE_ENUM');

Аналогично:

Java: int n = com.example.test.Foo.MAX_FOO;
MATLAB: n = javaMethod('com.example.test.Foo$MAX_FOO')

Статические поля могут быть получены непосредственно в Matlab с использованием простой точечной записи:

redColor = java.awt.Color.red;

Полный список статических полей может быть получен с помощью встроенной в Matlab функции struct :

>> staticFields = struct(java.awt.Color.red)
staticFields = 
      white: [1x1 java.awt.Color]
      WHITE: [1x1 java.awt.Color]
  lightGray: [1x1 java.awt.Color]
 LIGHT_GRAY: [1x1 java.awt.Color]
       gray: [1x1 java.awt.Color]
       GRAY: [1x1 java.awt.Color]
   darkGray: [1x1 java.awt.Color]
  DARK_GRAY: [1x1 java.awt.Color]
      black: [1x1 java.awt.Color]
      BLACK: [1x1 java.awt.Color]
        red: [1x1 java.awt.Color]
        RED: [1x1 java.awt.Color]
       pink: [1x1 java.awt.Color]
       PINK: [1x1 java.awt.Color]
     orange: [1x1 java.awt.Color]
     ORANGE: [1x1 java.awt.Color]
     yellow: [1x1 java.awt.Color]
     YELLOW: [1x1 java.awt.Color]
      green: [1x1 java.awt.Color]
      GREEN: [1x1 java.awt.Color]
    magenta: [1x1 java.awt.Color]
    MAGENTA: [1x1 java.awt.Color]
       cyan: [1x1 java.awt.Color]
       CYAN: [1x1 java.awt.Color]
       blue: [1x1 java.awt.Color]
       BLUE: [1x1 java.awt.Color]
     OPAQUE: 1
    BITMASK: 2
TRANSLUCENT: 3

Функция MATLAB javaObject может не работать, если конструктор по умолчанию является закрытым (скрытым), и javaMethod , вероятно, тоже не будет работать. Если класс со статическими методами вложен, возможно, вам не повезло.

В классе Java не существует конструктора с соответствующей подписью

К счастью, enum имеет встроенный метод valueOf () , который мы можем использовать с javaMethod :

Java: SomeEnum e = com.example.test.SomeEnum.MY_FAVORITE_ENUM;
MATLAB: e = javaMethod('valueOf','com.example.test$SomeEnum','MY_FAVORITE_ENUM');

Аналогично :

Java: int n = com.example.test.Foo.MAX_FOO;
MATLAB: n = javaMethod('com.example.test.Foo$MAX_FOO')

Статические поля могут быть получены непосредственно в Matlab с использованием простой точечной нотации:

redColor = java.awt.Color.red;

Полный список статических полей может быть получен с помощью встроенной в Matlab функции struct :

>> staticFields = struct(java.awt.Color.red)
staticFields = 
      white: [1x1 java.awt.Color]
      WHITE: [1x1 java.awt.Color]
  lightGray: [1x1 java.awt.Color]
 LIGHT_GRAY: [1x1 java.awt.Color]
       gray: [1x1 java.awt.Color]
       GRAY: [1x1 java.awt.Color]
   darkGray: [1x1 java.awt.Color]
  DARK_GRAY: [1x1 java.awt.Color]
      black: [1x1 java.awt.Color]
      BLACK: [1x1 java.awt.Color]
        red: [1x1 java.awt.Color]
        RED: [1x1 java.awt.Color]
       pink: [1x1 java.awt.Color]
       PINK: [1x1 java.awt.Color]
     orange: [1x1 java.awt.Color]
     ORANGE: [1x1 java.awt.Color]
     yellow: [1x1 java.awt.Color]
     YELLOW: [1x1 java.awt.Color]
      green: [1x1 java.awt.Color]
      GREEN: [1x1 java.awt.Color]
    magenta: [1x1 java.awt.Color]
    MAGENTA: [1x1 java.awt.Color]
       cyan: [1x1 java.awt.Color]
       CYAN: [1x1 java.awt.Color]
       blue: [1x1 java.awt.Color]
       BLUE: [1x1 java.awt.Color]
     OPAQUE: 1
    BITMASK: 2
TRANSLUCENT: 3

Функция MATLAB ] javaObject может не работать, если конструктор по умолчанию является закрытым (скрытым), и javaMethod , вероятно, тоже не будет работать. Если класс со статическими методами вложен, возможно, вам не повезло.

В классе Java не существует конструктора с соответствующей сигнатурой.

К счастью, enum имеет встроенный метод valueOf () , который мы можем использовать с javaMethod :

Java: SomeEnum e = com.example.test.SomeEnum.MY_FAVORITE_ENUM;
MATLAB: e = javaMethod('valueOf','com.example.test$SomeEnum','MY_FAVORITE_ENUM');

Аналогично :

Java: int n = com.example.test.Foo.MAX_FOO;
MATLAB: n = javaMethod('com.example.test.Foo$MAX_FOO')

Статические поля могут быть получены непосредственно в Matlab с использованием простой точечной нотации:

redColor = java.awt.Color.red;

Полный список статических полей может быть получен с помощью встроенной в Matlab функции struct :

>> staticFields = struct(java.awt.Color.red)
staticFields = 
      white: [1x1 java.awt.Color]
      WHITE: [1x1 java.awt.Color]
  lightGray: [1x1 java.awt.Color]
 LIGHT_GRAY: [1x1 java.awt.Color]
       gray: [1x1 java.awt.Color]
       GRAY: [1x1 java.awt.Color]
   darkGray: [1x1 java.awt.Color]
  DARK_GRAY: [1x1 java.awt.Color]
      black: [1x1 java.awt.Color]
      BLACK: [1x1 java.awt.Color]
        red: [1x1 java.awt.Color]
        RED: [1x1 java.awt.Color]
       pink: [1x1 java.awt.Color]
       PINK: [1x1 java.awt.Color]
     orange: [1x1 java.awt.Color]
     ORANGE: [1x1 java.awt.Color]
     yellow: [1x1 java.awt.Color]
     YELLOW: [1x1 java.awt.Color]
      green: [1x1 java.awt.Color]
      GREEN: [1x1 java.awt.Color]
    magenta: [1x1 java.awt.Color]
    MAGENTA: [1x1 java.awt.Color]
       cyan: [1x1 java.awt.Color]
       CYAN: [1x1 java.awt.Color]
       blue: [1x1 java.awt.Color]
       BLUE: [1x1 java.awt.Color]
     OPAQUE: 1
    BITMASK: 2
TRANSLUCENT: 3

Функция MATLAB ] javaObject может не работать, если конструктор по умолчанию является закрытым (скрытым), и javaMethod , вероятно, тоже не будет работать. Если класс со статическими методами вложен, возможно, вам не повезло. встроенная функция struct :

>> staticFields = struct(java.awt.Color.red)
staticFields = 
      white: [1x1 java.awt.Color]
      WHITE: [1x1 java.awt.Color]
  lightGray: [1x1 java.awt.Color]
 LIGHT_GRAY: [1x1 java.awt.Color]
       gray: [1x1 java.awt.Color]
       GRAY: [1x1 java.awt.Color]
   darkGray: [1x1 java.awt.Color]
  DARK_GRAY: [1x1 java.awt.Color]
      black: [1x1 java.awt.Color]
      BLACK: [1x1 java.awt.Color]
        red: [1x1 java.awt.Color]
        RED: [1x1 java.awt.Color]
       pink: [1x1 java.awt.Color]
       PINK: [1x1 java.awt.Color]
     orange: [1x1 java.awt.Color]
     ORANGE: [1x1 java.awt.Color]
     yellow: [1x1 java.awt.Color]
     YELLOW: [1x1 java.awt.Color]
      green: [1x1 java.awt.Color]
      GREEN: [1x1 java.awt.Color]
    magenta: [1x1 java.awt.Color]
    MAGENTA: [1x1 java.awt.Color]
       cyan: [1x1 java.awt.Color]
       CYAN: [1x1 java.awt.Color]
       blue: [1x1 java.awt.Color]
       BLUE: [1x1 java.awt.Color]
     OPAQUE: 1
    BITMASK: 2
TRANSLUCENT: 3

Функция MATLAB javaObject может не работать, если конструктор по умолчанию является закрытым (скрытым), а javaMethod , вероятно, не будет работать тоже. Если класс со статическими методами вложен, возможно, вам не повезло. встроенная функция struct :

>> staticFields = struct(java.awt.Color.red)
staticFields = 
      white: [1x1 java.awt.Color]
      WHITE: [1x1 java.awt.Color]
  lightGray: [1x1 java.awt.Color]
 LIGHT_GRAY: [1x1 java.awt.Color]
       gray: [1x1 java.awt.Color]
       GRAY: [1x1 java.awt.Color]
   darkGray: [1x1 java.awt.Color]
  DARK_GRAY: [1x1 java.awt.Color]
      black: [1x1 java.awt.Color]
      BLACK: [1x1 java.awt.Color]
        red: [1x1 java.awt.Color]
        RED: [1x1 java.awt.Color]
       pink: [1x1 java.awt.Color]
       PINK: [1x1 java.awt.Color]
     orange: [1x1 java.awt.Color]
     ORANGE: [1x1 java.awt.Color]
     yellow: [1x1 java.awt.Color]
     YELLOW: [1x1 java.awt.Color]
      green: [1x1 java.awt.Color]
      GREEN: [1x1 java.awt.Color]
    magenta: [1x1 java.awt.Color]
    MAGENTA: [1x1 java.awt.Color]
       cyan: [1x1 java.awt.Color]
       CYAN: [1x1 java.awt.Color]
       blue: [1x1 java.awt.Color]
       BLUE: [1x1 java.awt.Color]
     OPAQUE: 1
    BITMASK: 2
TRANSLUCENT: 3

Функция MATLAB javaObject может не работать, если конструктор по умолчанию является закрытым (скрытым), а javaMethod , вероятно, не будет работать тоже. Если класс со статическими методами вложен, возможно, вам не повезло. Для моей служебной программы системного лотка для обмена файлами я использовал подход отражения, как описано в этом сообщении: http://UndocumentedMatlab.com/blog/setting-system-tray-popup-messages/

Кредит: отредактировано автор Марк Микофски

12
ответ дан 18 December 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: