2009-08-03 151 views
4

我想知道在MATLAB中如何獲得對Java enum或靜態公共字段的引用。在MATLAB中,如果你要使用Java對象/方法,也有等同的Java對象創建/方法調用/等:在MATLAB中使用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:?????

+0

我假設你不能編輯Java Enum? – Instantsoup 2009-08-03 18:26:13

+0

在某些情況下,我可以,在某些我不能 – 2009-08-03 18:26:54

+0

這是類型安全枚舉的另一面:而不是調用loadWeirdFile('myfile.txt',1)其中有神奇的數字,但很容易,我打電話loadWeirdFile( 'myfile.txt',Options.SKIP_WEIRD_STUFF),它沒有幻數並且是類型安全的,但我無法從我的腳本環境訪問SKIP_WEIRD_STUFF常量。 :( – 2009-08-03 18:29:23

回答

6

您可以從MATLAB使用package.class.FIELD語法,與任何其他靜態Java領域中引用Java枚舉常量。假設你有一個枚舉。

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

您可以使用直接引用在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 

如果你想在運行時確定一個「動態」的提法,你可以構建一個包含相當於靜態引用一個字符串,並將其傳遞給eval( )。這幾乎適用於任何Matlab代碼。

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

而且,如果你想變得很花哨,可以在運行時使用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); 
    } 
} 

然後你就可以在Matlab枚舉常量。

% Constant enumeration using reflection 
klass = com.example.Reflector.forName('com.example.MyEnum'); 
enums = klass.getEnumConstants(); 
3

編輯: 從here這聽起來像常規的方式將工作。或者由於某種原因,Enums與其他具有靜態的類不同?

你可以用參數調用Java方法嗎?

SomeEnum e = com.example.test.SomeEnum.valueOf(SomeEnum.class, "MY_FAVORITE_ENUM") 
10

內部類需要轉換'。'到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函數調用類的構造函數,因爲枚舉沒有構造函數中,我們得到以下錯誤:

No constructor with appropriate signature exists in Java class

幸運的是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

2

我面臨着同樣的枚舉問題,因爲原來的第一部分編輯題。從像這裏的帖子放在一起的一些信息,我意識到,使用MATLAB的javaMethod函數來調用valueOf()作品:

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

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

至於第二個問題,關於靜態變量,我已經能夠使用MATLAB 2009b中的正常表示法訪問公共靜態變量,所以我在這裏沒有多大的幫助。假設MAX_FOO被聲明爲Foo類公共靜態INT,我可以這樣做:

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

MATLAB:n = com.example.test.Foo.MAX_FOO;

也許與通話一起對美元的跡象其他的答案中的一個fooVar.getClass().getFields()將會流露出一些光芒。