2016-09-01 57 views
3

我在一個matlab腳本化(但面向對象)的軟件中使用了java公共接口。在Matlab中使用Java:將Class類型作爲方法參數傳遞

我們經常需要調用java方法,這項工作完美無瑕。如果我有以下的Java類:

package com.toto 

public class Foo { 
    public static void printHello() { 
     System.out.println("Hello World"); 
    } 
} 

然後在Matlab我只要致電:

com.toto.Foo.printHello 

希望能在我的控制檯命令顯示的打印。

現在我想做的是類似於:

package com.toto 

public class Foo { 
    public static <E> void printClass(Class<E> type) { 
     System.out.println("My type: " + type); 
    } 
} 

public class Goo { 
.... 
} 

而且在Matlab:

com.toto.Foo.printClass(com.toto.Goo.class) 

這實際上是行不通的。

任何解決方案?

編輯:這裏是一個工作的Java例子,在主代碼應在MATLAB執行:

public class Test 
{ 
    public static void main(String[] args) 
    { 
    Foo.printClass(Goo.class); 
    } 
} 

public class Foo 
{ 
    public static <E> void printClass(Class<E> type) 
    { 
     System.out.println("My type: " + type); 
    } 
} 

public class Goo { 
    public Goo() {}; 
} 

回答

1

這裏的問題是,.class語法無效在Matlab:

com.toto.Goo.class 

你可以做的是做一個Goo的實例,然後在該對象上使用getClass方法:

goo = com.toto.Goo(); 
com.toto.Foo.printClass(goo.getClass()); 

或者,如果您只想使用Java類的名稱(或者例如在Java實例化不可能的情況下爲enum),則可以使用javaclass從。

此功能的主要部分是

jclass = java.lang.Class.forName('com.toto.Goo', ... 
    true, ... 
    java.lang.Thread.currentThread().getContextClassLoader()); 

其使用的ClassforName方法:

返回與類或接口與 給定字符串名稱相關聯的類對象,使用給定的類加載器。

第二種方法可用作Java .class語法的等效項。

+0

這實際上是我在做什麼。我有一個靜態getDefault()方法,因爲Goo實際上是一個枚舉,所以我不能在其中有一個公共構造函數。 但是,當然我在java 1.6上,所以我不能在接口中執行getDefault()方法,也不能在抽象類中執行getDefault()方法。所以我基本上依靠開發人員的善意來實現這個方法。 這就是爲什麼我不喜歡這個解決方案(並且我真的不喜歡java,在旁邊)。 – Zangdar

+0

爲您更新了答案。我希望它能滿足你的需求。 – DVarga

+0

非常感謝,Mathworks不鼓勵使用forName(它們表示使用javaObjectEDT),但在這種情況下,它非常好用 – Zangdar

相關問題