Andreas Rozek Lesehinweise letzte Änderungen Gästebuch-Eintrag Mitteilungen an den Autor  English Version  zur Leitseite zum vorherigen Thema zum nächsten Thema  zur ersten Seite zur vorherigen Seite zur nächsten Seite

Rhino_20 - Erzeugung von Java-Objekten

Dank "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.

Quelltexte

Alle hier vorgestellten Programme und Skripte sind im Quelltext verfügbar:

Haftungsausschluß

Bitte beachten Sie auch den Haftungsausschluß des Autors!

http://www.Andreas-Rozek.de/Rhino/Acquainting/Rhino_20.html    (letzter Stand: 06.04.2002)