Ich habe ein Scala-Objekt wie folgt definiert:
%Vor% Ich weiß, dass ich Foo$.MODULE$.bar()
von Java aufrufen kann, wenn Foo
im Klassenpfad build und runtime ist, aber in meiner Situation Foo
ist nicht im Klassenpfad und kann im Laufzeitklassenpfad konfiguriert sein oder nicht .
Aus meinem Java-Code möchte ich Reflection verwenden, um bar()
aufzurufen, wenn sie im Klassenpfad der Laufzeit verfügbar ist, ansonsten werde ich auf eine Standardimplementierung zurückgreifen.
Ist das möglich?
Sie können dies mit Code tun, der ungefähr so aussieht:
%Vor% Die Klasse des Objekts Foo ist com.example.Foo$
. Wenn Sie also nur diese Klasse laden können, wird alles ohne Reflektion funktionieren:
Inspiriert von David Carlsons answer Ich habe diese Utility-Klasse erstellt, um Methoden auf Scala-Objekten referenziell aufzurufen. Mit der Klasse können Sie auch Scala-Methoden aufrufen, die Parameter erwarten.
Ich lege es hier in der Hoffnung dar, dass es für jemanden nützlich ist und Feedback darüber, wie man den Code verbessern kann.
ScalaUtil.java:
%Vor%Um die Scala-Methode mit Parametern aufzurufen, müssen Sie die Scala-Bibliothek dem Build-Pfad Ihres Java-Projekts hinzufügen.
Angenommen, dies ist das Scala-Objekt, das Sie aufrufen möchten:
%Vor%So verwenden Sie die ScalaUtil auf dem obigen Scala-Objekt:
%Vor%Tags und Links scala java reflection