Java aus JRuby aufrufen
Der Aufruf von Java-Klassen aus Ruby heraus mit JRuby ist eine sehr einfache und schöne Möglichkeit, vorhandene Java-Bibliotheken weiter zu verwenden. Die Java-Klasse in Listing 1 dient als Beispiel für diese Möglichkeit.
Listing 1
package com.railsexperts.jruby.call2java;public class Call2Java {private String message;public Call2Java() {message = "Hello World!";}public void sayHello() {System.out.println(message);}public static void main(String[] args) {System.out.println("Main Methode wurde aufgerufen.");}}
Die Klasse ist sehr einfach gehalten und stellt im Grunde das klassische „Hello World!“-Programm dar. Im Konstruktor wird das Attribut message mit „Hello World!“ initialisiert. Die Methode sayHello gibt den Inhalt der Variablen message auf der Systemkonsole aus. Eine Ruby-Klasse namens Call2JavaOne soll nun die Klasse Call2Java instanziieren und die Methode sayHello aufrufen. Hierzu dient der folgende Ruby-Code:
include JavaCall2Java = com.railsexperts.jruby.call2java.Call2Javaclass Call2JavaOnedef initialize@call2java = Call2Java.newenddef sayHello@call2java.sayHelloendendc2j = Call2JavaOne.newc2j.sayHello
Die Datei call2javaone.rb enthält neben der Ruby-Klasse Call2JavaOne ein zweizeiliges Skript, um die Klasse zu instanziieren und die Methode sayHello aufzurufen. Die erste Zeile ist ein Include, das die Klassen aus dem Package java.lang in den Scope des Skripts bringt. Die zweite Zeile definiert den Typ Call2Java aus der zugehörigen Java-Klasse. Damit ist Call2Java einfacher zu verwenden, als wenn der komplette Package-Name angegeben werden müsste. Es wäre an dieser Stelle auch möglich, den Klassennamen zu verändern.
Die Klassendefinition für Call2JavaOne enthält einen Konstruktor (initialize-Methode), der eine Instanzvariable @call2java mit einer Instanz von Call2Java definiert. Die Methode sayHello delegiert den Aufruf an das Java-Objekt. Ruby hat bekanntlich seine eigenen Konventionen, wenn es um die Namensgebung von Methoden etc. geht. JRuby unterstützt diese Konventionen, und so könnte das obige Ruby-Skript auch folgendermaßen geschrieben werden:
include Javainclude_class "com.railsexperts.jruby.call2java.Call2Java"class Call2JavaOnedef initialize@call2java = Call2Java.newenddef say_hello@call2java.say_helloendendc2j = Call2JavaOne.newc2j.say_hello
JRuby kennt die Konventionen von Ruby und bietet neben der normalen Schreibweise von Java-Methoden entsprechende Ruby-Pendants an, die im Beispiel in Fettschrift hervorgehoben sind.















