Внутренние классы требуют преобразования '.' в $ в Matlab.
На самом деле это может быть связано с тем, как компилятор Java хранит объекты внутреннего класса. Он ведет себя аналогично для внутренних классов (например, javax.swing.plaf.basic.BasicTextUI$UpdateHandler
). Matlab не такой умный, как JVM, чтобы автоматически конвертировать эти внутренние «$» в «.». Следовательно, мы не можем использовать обычные простые точечные обозначения в этих случаях в Matlab, и, поскольку «$» является недопустимым символом в синтаксисе Matlab, мы должны прибегнуть к использованию «$» в javaObject
* 1006. *, javaMethod
, awtinvoke
и их родственников. Например:
Java: InnerClass c = new com.example.test.SomeEnum.InnerClass;
MATLAB: c = javaObject('com.example.test.SomeEnum$InnerClass')
Перечисления требуют аналогичного преобразования '.' в $ в Matlab. Но функция MATLAB javaObject
вызывает конструктор класса, и поскольку перечисления не имеют конструктора, мы получаем следующую ошибку:
В классе 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
, вероятно, также не будет работать. Если класс со статическими методами является вложенным, вам может не повезти.
Для моей утилиты systray на File Exchange я использовал подход отражения, как описано в этом посте: http://UndocumentedMatlab.com/blog/setting-system-tray-popup-messages/
Кредит: под редакцией Марк Микофски