Как в движке Rhino JavaScript может пользовательский объект Java быть экземпляром конечного класса java.lang.String?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как в движке Rhino JavaScript может пользовательский объект Java быть экземпляром конечного класса java.lang.String?

Сообщение Anonymous »

ОБНОВЛЕНИЕ: Основываясь на различных отзывах, я настолько существенно обновляю свой вопрос, что он отличается от исходного (хотя и все еще связан с ним). Я не знаю, какой протокол подходит для этого в StackOverflow, поэтому прошу прощения, если делаю что-то не так.
Я работаю в 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
Благодаря волшебству движка Rhino, GlideRecord и GlideElement являются не объектами JavaScript, а объектами Java, каким-то образом совместно используемыми в среде выполнения JavaScript. Странность объекта GlideElement заключается в том, что он каким-то образом является экземпляром java.lang.String:

Код: Выделить всё

gs.print(ge instanceof GlideElement);               // true
gs.print(ge instanceof Packages.java.lang.String);  // true
(Объект Packages предоставляется Rhino для доступа к таким вещам, как java.lang.String. Это выглядит подозрительно, но, насколько я знаю, это настоящий java.lang.String из Java, ничего смешного.)
Мой первоначальный вопрос заключался в том, как что-то может быть экземпляром двух классов, и теперь я понимаю, что это обычная вещь, обеспечиваемая полиморфизмом (подклассификация и реализация интерфейса). Однако класс java.lang.String является финальным классом, поэтому он не должен быть подклассом или реализован каким-либо другим классом.
К сожалению, приведенный выше код — это все, что я могу предоставить, поскольку код Java платформы SaaS не является открытым исходным кодом, поэтому я не могу (и никто не может) увидеть, как GlideRecord и GlideElement реализованы под капотом. Без доступа к исходному коду, что мы можем знать или предполагать о том, как это могло быть реализовано либо в стандартной Java, либо в какой-то загадочной магии, доступной движку Rhino?
Приведенный выше код можно выполнить, если у вас есть доступ к любому экземпляру ServiceNow. Вы можете бесплатно зарегистрироваться и запустить «личный экземпляр разработчика» ServiceNow на https://developer.servicenow.com. Если у вас есть экземпляр, вы можете перейти в раздел «Все» › «Определение системы» › «Скрипты — Фон», чтобы вставить и выполнить произвольный код JavaScript.

Подробнее здесь: https://stackoverflow.com/questions/789 ... tance-of-f
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»