2016-09-01 4 views
3

Ich benutze eine Java-öffentliche Schnittstelle in einer Matlab-Skript-Software (aber objektorientiert).Verwendung von Java mit Matlab: Übergabe des Klassentyps als Methodenargument

Wir müssen oft Java-Methoden aufrufen und das funktioniert einwandfrei. Wenn ich die folgende Java-Klasse haben:

package com.toto 

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

Dann in Matlab Ich nenne nur:

com.toto.Foo.printHello 

Um den Druck in meinem Konsolenbefehl angezeigt zu bekommen.

was Nun würde ich tun möchte, ist etwas Ähnliches wie:

package com.toto 

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

public class Goo { 
.... 
} 

Und in Matlab:

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

das ist eigentlich nicht funktioniert.

Irgendeine Lösung dafür?

Edit: hier ein funktionierendes Java-Beispiel ist, sollte der Code in Haupt unter Matlab ausgeführt werden:

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() {}; 
} 

Antwort

1

Das Problem hierbei ist, dass die .class Syntax nicht gültig in Matlab ist:

com.toto.Goo.class 

Sie können eine Instanz von Goo erstellen und dann die Methode getClass für dieses Objekt verwenden:

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

Oder wenn Sie nur den Namen der Java-Klasse verwenden möchten (oder zum Beispiel im Fall von Java enum s, wo die Instanziierung nicht möglich ist), können Sie javaclass von verwenden.

Der Hauptteil dieser Funktion ist

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

die die forName Methode der Class verwendet:

Gibt das Klassenobjekt mit der Klasse oder Schnittstelle mit der String-Namen zugeordnet, unter Verwendung von der gegebene Klassenlader.

Dieser zweite Ansatz kann als ein Äquivalent der Java .class Syntax verwendet werden.

+0

Das ist eigentlich was ich mache. Ich habe eine statische getDefault() -Methode, weil Goo eigentlich eine Enum ist, also kann ich keinen öffentlichen Konstruktor darin haben. Allerdings bin ich auf Java 1.6, so kann ich weder die Methode getDefault() in einer Schnittstelle noch eine abstrakte Klasse erzwingen. Ich verlasse mich also grundsätzlich auf den guten Willen des Entwicklers, diese Methode zu implementieren. Dies ist, warum ich diese Lösung nicht mag (und dass ich Java auf der Seite wirklich nicht mag). – Zangdar

+0

Die Antwort wurde für Sie aktualisiert. Ich hoffe, es befriedigt Ihre Bedürfnisse. – DVarga

+0

Das ist großartig, MathWorks rät von der Verwendung von forName ab (sie geben an, javaObjectEDT zu verwenden), aber in diesem Fall ist es ein wirklich netter Gebrauch – Zangdar

Verwandte Themen