Я работаю в ServiceNow, популярной платформе «Программное обеспечение как услуга», реализованной на Java, которая выполняет код JavaScript клиента с использованием механизма JavaScript Rhino. Одним из их API является GlideRecord, который клиенты API используют для выполнения операций CRUD с базой данных MySQL, где все данные хранятся на платформе.
Когда я получаю доступ к определенному значению поля через API GlideRecord, значение поля предоставляется в форме объекта под названием GlideElement:
Код: Выделить всё
// JavaScript code
var gr = new GlideRecord('incident');
gr.setLimit(1);
gr.query();
gr.next();
var ge = gr.short_description; // GlideElement object
Код: Выделить всё
gs.print(ge instanceof GlideElement); // true
gs.print(ge instanceof Packages.java.lang.String); // true
Мой первоначальный вопрос заключался в том, как что-то может быть экземпляром двух классов, и теперь я понимаю, что это обычная вещь, обеспечиваемая полиморфизмом (подклассификация и реализация интерфейса). Однако класс java.lang.String является финальным классом, поэтому он не должен быть подклассом или реализован каким-либо другим классом.
К сожалению, приведенный выше код — это все, что я могу предоставить, поскольку код Java платформы SaaS не является открытым исходным кодом, поэтому я не могу (и никто не может) увидеть, как GlideRecord и GlideElement реализованы под капотом. Без доступа к исходному коду, что мы можем знать или предполагать о том, как это могло быть реализовано либо в стандартной Java, либо в какой-то загадочной магии, доступной движку Rhino?
Приведенный выше код можно выполнить, если у вас есть доступ к любому экземпляру ServiceNow. Вы можете бесплатно зарегистрироваться и запустить «личный экземпляр разработчика» ServiceNow на https://developer.servicenow.com. Если у вас есть экземпляр, вы можете перейти в раздел «Все» › «Определение системы» › «Скрипты — Фон», чтобы вставить и выполнить произвольный код JavaScript.
Подробнее здесь: https://stackoverflow.com/questions/789 ... tance-of-f
Мобильная версия