Есть ли эквивалент Java для __call PHP ?
Для меня было бы разумно, если бы это было не так, потому что это могло бы привести к ошибкам компилятора.
Из руководства PHP по магическим методам :
__call()
запускается при вызове недоступных методов в контексте объекта.
Такое динамическое разрешение метода / атрибута, которое является общим для динамически типизированных языков, таких как PHP, Python и Ruby, напрямую не поддерживается на языке Java.
Эффект можно аппроксимировать с помощью Dynamic Proxies, который требует наличия интерфейса, для которого реализация будет динамически разрешена. Сторонние библиотеки, такие как CGLIB, позволяют выполнять аналогичные действия с обычными Java-классами.
Этот API-интерфейс, специальный случай перехвата вызова метода не так удобен, как прямая, всегда поддержка, которую вы можете получить с __call
в PHP или эквивалентные функции на других динамически типизированных языках (например, __getattr__
в Python). Это различие обусловлено принципиально различными способами, с помощью которых отправка метода обрабатывается на двух типах языков.
Нет, нет.
как сказал другой, java не поддерживает это.
он имеет что-то, называемое прокси-классом, который может перехватывать вызовы известным методам (а не неопределенным методам, как в php's __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, но все вызовы перехватываются методом invoke () FooImpl.
чтобы создать действительно класс de novo во время выполнения с динамическими методами в своем интерфейсе, вы можете по существу скомпилировать определение класса и использовать загрузчик классов java для его импорта во время выполнения. такой инструмент, как apache JCI или Arch4J, может справиться с этим для вас. Тем не менее, класс будет иметь только те методы, которые вы указали.
Нет, java – это скомпилированный язык, и компилятор хочет убедиться, что каждая вызванная вами функция фактически существует.
Нет, у Java нет этой функции. Во-первых, я думаю, что это сделает перегрузку практически невозможной (некоторые утверждают, что перегрузка – это плохая идея, но это не тот подходящий форум для обсуждения). Помимо этого, я понимаю, что разработчики Java просто чувствуют, что гибкость что-то вроде этого (я знаю, что это из Perl, где она называется AUTOLOAD
) перевешивается гарантией того, что любой код, который компилирует, является только вызывающим методом, который фактически существует (запрет двоичные несовместимости).