内部类需要转换 '.'到 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')
枚举需要类似的“.”转换到 Matlab 中的“$”。但是MATLAB的javaObject函数调用了类的构造函数,由于枚举没有构造函数,我们得到如下错误:
Java 类中不存在具有适当签名的构造函数
幸运的是 enum has the builtin method 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 也可能不起作用。如果具有静态方法的类是嵌套的,您可能会不走运。
对于文件交换上的系统托盘实用程序,我使用了反射方法,如本文所述:http://UndocumentedMatlab.com/blog/setting-system-tray-popup-messages/
来源:Mark Mikofski编辑