在MATLAB中使用Java枚举或公共静态字段

Jas*_*n S 5 java matlab enums

我想知道如何在MATLAB中获得对Java enum或静态公共字段的引用.在MATLAB中,如果您正在尝试使用Java对象/方法,那么Java对象创建/方法调用等等就是:

Java的: new com.example.test.Foo();

MATLAB: javaObject('com.example.test.Foo');

Java的: com.example.test.Foo.staticMethod();

MATLAB: javaMethod('staticMethod', 'com.example.test.Foo');

Java的: SomeEnum e = com.example.test.SomeEnum.MY_FAVORITE_ENUM;

MATLAB:?????

Java : int n = com.example.test.Foo.MAX_FOO;

MATLAB:?????

Yai*_*man 12

内部类需要转换'.' 到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')
Run Code Online (Sandbox Code Playgroud)

枚举需要类似的'.'转换.到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');
Run Code Online (Sandbox Code Playgroud)

同理:

Java: int n = com.example.test.Foo.MAX_FOO;
MATLAB: n = javaMethod('com.example.test.Foo$MAX_FOO')
Run Code Online (Sandbox Code Playgroud)

可以使用简单的点符号在Matlab中直接获取静态字段:

redColor = java.awt.Color.red;
Run Code Online (Sandbox Code Playgroud)

可以使用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
Run Code Online (Sandbox Code Playgroud)

javaObject如果默认构造函数是私有(隐藏),MATLAB的函数可能不起作用,并且javaMethod可能也不起作用.如果嵌套静态方法的类可能会运气不好.对于我在文件交换中的systray实用程序,我使用了反射方法,如本文所述:http://UndocumentedMatlab.com/blog/setting-system-tray-popup-messages/

图片来源:Mark Mikofski编辑


And*_*nke 6

您可以使用package.class.FIELD语法从Matlab引用Java枚举常量,就像使用任何其他静态Java字段一样.假设你有一个枚举.

package com.example;
public enum MyEnum {
    FOO, BAR, BAZ
}
Run Code Online (Sandbox Code Playgroud)

您可以使用直接引用获取Matlab中的枚举常量.(当然,Java类必须在Matlab的javaclasspath中.)

% 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
Run Code Online (Sandbox Code Playgroud)

如果要在运行时确定"动态"引用,可以只构建包含等效静态引用的字符串并将其传递给eval().这几乎适用于任何Matlab代码.

% Dynamic reference
foo = eval('com.example.MyEnum.FOO')
Run Code Online (Sandbox Code Playgroud)

如果你想变得非常花哨,可以使用Java反射在运行时获取所有枚举常量.使用其他自定义类创建一个瘦的包装器,以便使用Matlab的类加载器来解决问题.(没有Matlab javaClass()等价;恕我直言这是Matlab的疏忽.)

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

然后你可以在Matlab中枚举常量.

% Constant enumeration using reflection
klass = com.example.Reflector.forName('com.example.MyEnum');
enums = klass.getEnumConstants();
Run Code Online (Sandbox Code Playgroud)