Можете ли вы расширить абстрактные классы Java из JavaScript?

Я работаю над проектом, который очень интенсивно использует пакеты javax.script. *. У меня есть ситуация, когда я хотел бы создать объекты JavaScript, которые расширяют абстрактный Java-класс, так же, как вы можете использовать Invocable.getInterface для создания объектов JavaScript, которые реализуют интерфейсы Java. Это возможно? И если да, то как ты это делаешь?

2 ответа

Решение

Если вы не хотите идти по пути генерации байт-кода во время выполнения (используя BCEL, как показано ниже), то нет. Вы можете сделать это с интерфейсами, используя прокси-классы, но нет эквивалента для абстрактных классов.

Если вы действительно хотите попробовать BCEL, ваша лучшая стратегия заключается в следующем:

  1. Напишите метод, который использует BCEL для генерации byte[] байт-кода для нового класса, который расширяет абстрактный класс и делегирует каждый абстрактный метод JavaScript.
  2. Определите соглашение об именовании, которое связывает абстрактные классы с оболочкой, например foo.MyAbstractClass соответствует foo.MyAbstractClassDynamicLangWrapper,
  3. Ролл ClassLoader который реализует findClass, чтобы распознать это соглашение об именах и сгенерировать байты класса и вызвать defineClass
  4. Убедитесь, что ваш язык сценариев использует ваш собственный загрузчик классов для разрешения имен классов в сценариях. Я думаю, что в Rhino вы используете setApplicationClassLoader, но я не уверен.

Да, ты можешь; предыдущий плакат неверен. Смотрите документацию по JavaAdapter.

Другие вопросы по тегам