| Andreas Rozek |
|
Rhino_20 - Erzeugung von Java-ObjektenDank "LiveConnect" kann aus JavaScript heraus relativ problemlos auf Java-Klassen und -Objekte zugegriffen werden. "Rhino_20" ist ein erstes Beispiel dafür und instanziert von JavaScript aus eine Reihe von Java-Objekten. Der Java-Teil von "Rhino_20" definiert zu diesem Zweck eine einfache Klasse mit einer Reihe von Eigenschaften (jeweils eine für die verschiedenen "primitiven" Datentypen, die Java zur Verfügung stellt) sowie einer einfachen Methode mit einem Ergebnis vom Typ java.lang.String. Alle Datenfelder und Methoden der Klasse sind als "public" deklariert, damit "LiveConnect" diese unter JavaScript zur Verfügung stellt. Im JavaScript-Teil von "Rhino_20" werden zunächst Instanzen der Objekt-Versionen aller primitiven Java-Datentypen angelegt und untersucht. Anschließend geschieht dasselbe mit der Klasse java.lang.String sowie mit der im Java-Teil definierten Klasse. Die "Rhino_20"-Instanz wird außerdem versuchsweise modifiziert sowie um ein neues Datenfeld erweitert bzw. um ein altes Datenfeld verkleinert - auch der Zugriff auf ein nicht existierendes Feld wird versucht. Zu guter letzt wird noch auf ein bereits existierendes Objekt (nämlich java.lang.System) zugegriffen. Das Programm wird ohne weitere Parameter aufgerufen java Rhino Rhino_20.js und liefert folgende Ausgabe: aBoolean = true (object, no (own) properties)
aByte = 1 (object, no (own) properties)
aShort = 2 (object, no (own) properties)
anInteger = 3 (object, no (own) properties)
aLong = 4 (object, no (own) properties)
aFloat = 5.0 (object, naN:false, infinite:false)
aDouble = 6.0 (object, naN:false, infinite:false)
aString = "(anything)" (object, no (own) properties)
anObject = true, 1, 2, 3, 4, 5.0, 6.0, "(anything)" (object,
aBoolean:true, aLong:4, aString:(anything), anInteger:3, aDouble:6,
aFloat:5, aShort:2, aByte:1)
modifying "anObject":
new contents: aBoolean:false, aLong:5, aString:(another thing),
anInteger:4, aDouble:7, aFloat:6, aShort:3, aByte:2
trying to access an inexistent object slot:
anObject.missingSlot = undefined
trying to access "java.lang.System":
- properties: {java.runtime.name=Java(TM) 2 Runtime Environment, Standard
Edition, sun.boot.library.path=C:\PROGRAMME\JAVA\JRE\bin,
java.vm.version=1.3.1-b24, java.vm.vendor=Sun Microsystems Inc.,
java.vendor.url=http://java.sun.com/, path.separator=;, java.vm.name=Java
HotSpot(TM) Client VM, file.encoding.pkg=sun.io,
java.vm.specification.name=Java Virtual Machine Specification,
user.dir=C:\Rozek\Rhino\Acquainting, java.runtime.version=1.3.1-b24,
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment, os.arch=x86,
java.io.tmpdir=c:\Windows\temp\, line.separator=
, java.vm.specification.vendor=Sun Microsystems Inc., java.awt.fonts=,
os.name=Windows 98, java.library.path=C:\PROGRAMME\JAVA\BIN;.;
C:\WINDOWS\SYSTEM;C:\WINDOWS;.;C:\PROGRAMME\JAVA\BIN;
C:\PROGRAMME\JAVAMF\BIN;C:\PROGRAMME\WABA\BIN;;C:\WINDOWS;C:\WINDOWS;
C:\WINDOWS\COMMAND;C:\PROGRAMME;C:\WINDOWS;C:\WINDOWS\COMMAND;;
C:\PROGRAMME\MBONE;C:\PROGRAMME\GHOSTSCRIPT\GS5.10;
C:\PROGRAMME\LEJOS\BIN, java.specification.name=Java Platform API
Specification, java.class.version=47.0, os.version=4.10,
user.home=C:\WINDOWS, user.timezone=Europe/Berlin,
java.awt.printerjob=sun.awt.windows.WPrinterJob, file.encoding=Cp1252,
java.specification.version=1.3, java.class.path=.;c:\Rozek\Java;
c:\Programme\BeanShell\BeanShell.jar;c:\Programme\JavaMF\lib\sound.jar;
c:\Programme\JavaMF\lib\jmf.jar;c:\Programme\Java\lib\comm.jar;
c:\Programme\Waba\Classes, user.name=Rozek,
java.vm.specification.version=1.0, java.home=C:\PROGRAMME\JAVA\JRE,
user.language=de, java.specification.vendor=Sun Microsystems Inc.,
awt.toolkit=sun.awt.windows.WToolkit, java.vm.info=mixed mode,
java.version=1.3.1, java.ext.dirs=C:\PROGRAMME\JAVA\JRE\lib\ext,
sun.boot.class.path=C:\PROGRAMME\JAVA\JRE\lib\rt.jar;
C:\PROGRAMME\JAVA\JRE\lib\i18n.jar;
C:\PROGRAMME\JAVA\JRE\lib\sunrsasign.jar;C:\PROGRAMME\JAVA\JRE\classes,
java.vendor=Sun Microsystems Inc., file.separator=\,
java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport.cgi,
sun.io.unicode.encoding=UnicodeLittle, sun.cpu.endian=little,
user.region=DE, sun.cpu.isalist=pentium i486 i386}
- arraycopy: function arraycopy() {/* void arraycopy(java.lang.Object,int,
java.lang.Object,int,int) */}
- load: function load() {/* void load(java.lang.String) */}
- getSecurityManager: function getSecurityManager() {/*
java.lang.SecurityManager getSecurityManager() */}
- setIn: function setIn() {/* void setIn(java.io.InputStream) */}
- out: java.io.PrintStream@7dc96c
- getProperty: function getProperty() {/* java.lang.String getProperty(
java.lang.String) java.lang.String getProperty(java.lang.String,
java.lang.String) */}
- setProperty: function setProperty() {/* java.lang.String setProperty(
java.lang.String,java.lang.String) */}
- err: java.io.PrintStream@32fd8f
- setSecurityManager: function setSecurityManager() {/* void
setSecurityManager(java.lang.SecurityManager) */}
- runFinalization: function runFinalization() {/* void runFinalization() */}
- setProperties: function setProperties() {/* void setProperties(
java.util.Properties) */}
- setOut: function setOut() {/* void setOut(java.io.PrintStream) */}
- getProperties: function getProperties() {/* java.util.Properties
getProperties() */}
- setErr: function setErr() {/* void setErr(java.io.PrintStream) */}
- in: java.io.BufferedInputStream@220892
- currentTimeMillis: function currentTimeMillis() {/* long
currentTimeMillis() */}
- loadLibrary: function loadLibrary() {/* void loadLibrary(
java.lang.String) */}
- runFinalizersOnExit: function runFinalizersOnExit() {/* void
runFinalizersOnExit(boolean) */}
- gc: function gc() {/* void gc() */}
- mapLibraryName: function mapLibraryName() {/* java.lang.String
mapLibraryName(java.lang.String) */}
- exit: function exit() {/* void exit(int) */}
- identityHashCode: function identityHashCode() {/* int identityHashCode(
java.lang.Object) */}
- securityManager: null
- getenv: function getenv() {/* java.lang.String getenv(java.lang.String) */}
(Achtung: manche Ausgabezeilen sind sehr lang und wurden an dieser Stelle deshalb auf mehrere Anzeigezeilen umgebrochen) Die sehr angenehme "Botschaft" dieser Programmausgabe lautet: dank "LiveConnect" kann von JavaScript aus sehr einfach auf bereits existierende Java-Klassen und Objekte zugegriffen werden, ohne daß diese dazu vorher eigens angepaßt werden müßten. Die Java-Objekte können wie JavaScript-Objekte untersucht und angesprochen werden. Der explizite (lesende) Zugriff auf nicht vorhandene Datenfelder eines Java-Objektes liefert "undefined" als Ergebnis (wirft aber keine Ausnahme!). Der Versuch, existierende Java-Objekte zur Laufzeit um neue Datenfelder zu erweitern, oder existierende Datenfelder zu entfernen, hat jedoch eine (unter JavaScript) nicht abfangbare Ausnahme zur Folge! Dasselbe gilt für den Versuch, einem Datenfeld des Java-Objektes einen Wert zuzuweisen, der nicht in den Java-Datentyp dieses Datenfeldes konvertiert werden kann. Die feste Typ-Bindung unter Java bleibt den Java-Objekten also erhalten. QuelltexteAlle hier vorgestellten Programme und Skripte sind im Quelltext verfügbar: |
| http://www.Andreas-Rozek.de/Rhino/Acquainting/Rhino_20.html | (letzter Stand: 06.04.2002) |