PHP __call эквивалент для java

Есть ли эквивалент 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 ) перевешивается гарантией того, что любой код, который компилирует, является только вызывающим методом, который фактически существует (запрет двоичные несовместимости).