Можете ли вы расширить абстрактные классы Java из JavaScript?
Я работаю над проектом, который очень интенсивно использует пакеты javax.script. *. У меня есть ситуация, когда я хотел бы создать объекты JavaScript, которые расширяют абстрактный Java-класс, так же, как вы можете использовать Invocable.getInterface для создания объектов JavaScript, которые реализуют интерфейсы Java. Это возможно? И если да, то как ты это делаешь?
2 ответа
Если вы не хотите идти по пути генерации байт-кода во время выполнения (используя BCEL, как показано ниже), то нет. Вы можете сделать это с интерфейсами, используя прокси-классы, но нет эквивалента для абстрактных классов.
Если вы действительно хотите попробовать BCEL, ваша лучшая стратегия заключается в следующем:
- Напишите метод, который использует BCEL для генерации
byte[]
байт-кода для нового класса, который расширяет абстрактный класс и делегирует каждый абстрактный метод JavaScript. - Определите соглашение об именовании, которое связывает абстрактные классы с оболочкой, например
foo.MyAbstractClass
соответствуетfoo.MyAbstractClassDynamicLangWrapper
, - Ролл
ClassLoader
который реализует findClass, чтобы распознать это соглашение об именах и сгенерировать байты класса и вызвать defineClass - Убедитесь, что ваш язык сценариев использует ваш собственный загрузчик классов для разрешения имен классов в сценариях. Я думаю, что в Rhino вы используете setApplicationClassLoader, но я не уверен.
Да, ты можешь; предыдущий плакат неверен. Смотрите документацию по JavaAdapter.