Wie kann in der Rhino-JavaScript-Engine ein benutzerdefiniertes Java-Objekt eine Instanz der endgültigen Klasse java.lanJava

Java-Forum
Anonymous
 Wie kann in der Rhino-JavaScript-Engine ein benutzerdefiniertes Java-Objekt eine Instanz der endgültigen Klasse java.lan

Post by Anonymous »

UPDATE: Aufgrund verschiedener Rückmeldungen aktualisiere ich meine Frage erheblich, so dass sie sich von der ursprünglichen Frage unterscheidet (aber immer noch damit zusammenhängt). Ich weiß nicht, welches das richtige Protokoll dafür auf StackOverflow ist, daher tut es mir leid, wenn ich das Falsche mache.
Ich arbeite in ServiceNow, einer beliebten Software-as-a-Service-Plattform, die in Java implementiert ist und Kunden-JavaScript-Code mithilfe der Rhino-JavaScript-Engine ausführt. Eine ihrer APIs ist GlideRecord. Dabei handelt es sich um die API, die Kunden verwenden, um CRUD-Vorgänge für die MySQL-Datenbank durchzuführen, in der alle Daten auf der Plattform gespeichert sind.
Wenn ich über die GlideRecord-API auf einen bestimmten Feldwert zugreife, wird der Feldwert in Form eines Objekts namens GlideElement bereitgestellt:

Code: Select all

// JavaScript code
var gr = new GlideRecord('incident');
gr.setLimit(1);
gr.query();
gr.next();
var ge = gr.short_description; // GlideElement object
Durch die Magie der Rhino-Engine sind sowohl GlideRecord als auch GlideElement keine JavaScript-Objekte, sondern Java-Objekte, die irgendwie in der JavaScript-Laufzeit geteilt werden. Das Seltsame am GlideElement-Objekt ist, dass es irgendwie eine Instanz von java.lang.String:
zu sein scheint

Code: Select all

gs.print(ge instanceof GlideElement);               // true
gs.print(ge instanceof Packages.java.lang.String);  // true
(Das Packages-Objekt wird von Rhino bereitgestellt, um auf Dinge wie java.lang.String zuzugreifen. Das sieht faul aus, aber soweit ich weiß, handelt es sich um den echten java.lang.String aus Java, keine lustige Angelegenheit.)
Meine ursprüngliche Frage lautete, wie etwas eine Instanz zweier Klassen sein könnte, und ich verstehe jetzt, dass dies eine gewöhnliche Sache ist, die durch Polymorphismus (Unterklassen und Schnittstellenimplementierung) ermöglicht wird. Die java.lang.String-Klasse ist jedoch eine finale-Klasse und sollte daher nicht von einer anderen Klasse subklassierbar oder umsetzbar sein.
Leider stellt der obige Code die Gesamtheit dessen dar, was ich bereitstellen kann, da der Java-Code der SaaS-Plattform nicht Open Source ist, sodass ich nicht (und niemand) sehen kann, wie GlideRecord und GlideElement unter der Haube implementiert werden. Was können wir ohne Zugriff auf den Quellcode darüber wissen oder darüber spekulieren, wie dies entweder in Vanilla Java oder einer durch die Rhino-Engine aktivierten arkanen Hexenmagie hätte implementiert werden können?
Der obige Code kann ausgeführt werden, wenn Sie Zugriff auf eine beliebige ServiceNow-Instanz haben. Sie können sich kostenlos registrieren und eine „persönliche Entwicklerinstanz“ von ServiceNow unter https://developer.servicenow.com einrichten. Sobald Sie eine Instanz haben, können Sie zu Alle › Systemdefinition › Skripte – Hintergrund navigieren, um beliebigen JavaScript-Code einzufügen und auszuführen.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post