PHP __call эквивалент для java
Есть ли эквивалент Java для __ вызов PHP?
Мне было бы разумно, если бы это не так, потому что это могло бы привести к ошибкам компилятора.
Из руководства PHP по магическим методам:
__call()
запускается при вызове недоступных методов в контексте объекта.
Ответы
Ответ 1
Этот тип динамического разрешения метода/атрибута, который является общим для динамически типизированных языков, таких как PHP, Python и Ruby, напрямую не поддерживается на языке Java.
Эффект можно аппроксимировать с помощью Dynamic Proxies, который требует наличия интерфейса, для которого реализация будет динамически разрешена. Сторонние библиотеки, такие как CGLIB, позволяют выполнять аналогичные действия с обычными Java-классами.
Этот API-интерфейс, специальный случай перехвата вызова метода не так удобен, как прямая, всегда поддержка, которую вы можете получить с помощью __call
в PHP или эквивалентных функциях на других языках с динамически типизированными (например, __getattr__
в Python), Это различие обусловлено принципиально различными способами обработки метода в двух типах языков.
Ответ 2
Нет, нет.
Ответ 3
как сказал другой, java не поддерживает это.
у него есть что-то, называемое прокси-классом, который может перехватывать вызовы на известные методы (а не undefined методы, как в php __call()). прокси-сервер может быть создан динамически как обертка вокруг любого интерфейса:
http://tutorials.jenkov.com/java-reflection/dynamic-proxies.html#proxy
http://java.sun.com/j2se/1.4.2/docs/guide/reflection/proxy.html#examples
Foo foo = (Foo) DebugProxy.newInstance(new FooImpl());
foo.bar(null);
foo выглядит как Foo, но все вызовы перехватываются методом FooImpl invoke().
чтобы создать действительно класс de novo во время выполнения с динамическими методами в своем интерфейсе, вы можете, по существу, скомпилировать определение класса и использовать загрузчик класса java для его импорта во время выполнения. такой инструмент, как apache JCI или Arch4J может справитесь с этим для вас. Тем не менее, класс будет иметь только те методы, которые вы указали.
Ответ 4
Нет, java - это скомпилированный язык, и компилятор хочет убедиться, что все функции, которые вы вызываете, действительно существуют.
Ответ 5
Нет, у Java нет этой функции. Во-первых, я думаю, что это сделает перегрузку практически невозможной (некоторые утверждают, что перегрузка - это плохая идея, но это не тот подходящий форум для обсуждения). Помимо этого, я понимаю, что разработчики Java просто чувствуют, что гибкость что-то вроде этого (я знаю, что это из Perl, где она называется AUTOLOAD
), перевешивается гарантией того, что любой код, который компилирует, является только вызывающим методом, который фактически существует (запрет двоичной несовместимости).