Rhino Method Shutter/Interceptor

Я ищу способ перехватить все вызовы методов из JavaScript (Rhino/Java) для всех без исключения Java-объектов (Java-методы).

Я бы хотел:

  • считать их (по имени метода и аргументам)
  • быть в состоянии вызвать исключение, если метод запрещен

Есть ли способ для этого внутри Rhino-Engine?

Я знаю, что есть и другие варианты, такие как Aspect-Oriented-Programming-Libraries, но я хочу их избежать.

Я также пытался заменить NativeJavaMethod Реализация в движке Rhino, но очень глубоко связана с системой и не может быть заменена.

Если бы была только фабрика для тех (как с ContextFactory), это было бы здорово.

Или перехватчик вызова метода, как ContextFactory.doTopCall(...), но для всех вызовов JS-2-Java.

2 ответа

Я нашел замену Rhino ClassShutter: SandboxShutter, который выглядит многообещающе.

Если вы просто хотите перехватывать вызовы методов Java-объектов, тогда это возможно. Переопределите создание объектов Context, переопределив метод makeContext фабрики контекста при инициализации фабрики контекста (в большинстве случаев это глобальная фабрика контекста).

Переопределите фабрику оберток в контексте, переопределите метод wrapAsJavaObject и верните анонимную реализацию NativeJavaObject, которая переопределяет методы get() и put(). Каждый раз, когда что-то помещается (например, свойство или метод), проверьте, является ли это FieldAndMethods. Создайте новый класс, который выходит из FieldAndMethods, а также упаковывает его (содержит), создайте экземпляр этого класса, передав исходный объект конструктору, и поместите этот экземпляр вместо исходного экземпляра.

Новый класс должен переопределить метод call() для перехвата. и просто вызовите содержащийся метод вызова объектов.

Если вам нужен пример кода, дайте мне знать.

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