Можете ли вы расширить абстрактные классы Java из JavaScript? - PullRequest
4 голосов
/ 28 июня 2011

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

Ответы [ 2 ]

2 голосов
/ 12 июля 2011

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

.
0 голосов
/ 28 июня 2011

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

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

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