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() для перехвата. и просто вызовите содержащийся метод вызова объектов.
Если вам нужен пример кода, дайте мне знать.