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
zu sein scheint
Code: Select all
gs.print(ge instanceof GlideElement); // true
gs.print(ge instanceof Packages.java.lang.String); // true
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.
Mobile version