PHP __call эквивалент для Java - PullRequest
       3

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

14 голосов
/ 12 января 2010

Существует ли Java-эквивалент для вызова __ PHP ?

Для меня это будет иметь смысл, если это не так, потому что это может привести к ошибкам компилятора.

Из руководства PHP по магическим методам :

__call() срабатывает при вызове недоступных методов в контексте объекта.

Ответы [ 5 ]

14 голосов
/ 12 января 2010

Этот вид динамического разрешения метода / атрибута, который распространен в динамически типизированных языках, таких как PHP, Python и Ruby, не поддерживается напрямую в языке Java.

Эффект можно аппроксимировать, используя Динамические прокси , для которого требуется интерфейс, для которого реализация будет динамически разрешаться. Сторонние библиотеки, такие как CGLIB , позволяют выполнять аналогичные действия с обычными классами Java.

Этот основанный на API специальный случайный перехват вызова метода не так удобен, как прямая, всегда поддерживаемая поддержка, которую вы можете получить с __call в PHP или эквивалентными функциями в других динамически типизированных языках (таких как __getattr__ в Python) , Эта разница обусловлена ​​принципиально разными способами обработки методов в двух типах языков.

9 голосов
/ 12 января 2010

Нет, нет.

4 голосов
/ 12 января 2010

как уже говорилось, Java не поддерживает это.

в нем есть нечто, называемое прокси-классом, который может перехватывать вызовы известных методов (а не неопределенных методов, как в __call () php). прокси может быть создан динамически как оболочка для любого интерфейса:

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's JCI или Arch4J может с этим справиться. тем не менее, у класса будут только те методы, которые вы укажете.

0 голосов
/ 12 января 2010

Нет, java - это скомпилированный язык, и компилятор хочет убедиться, что каждая функция, которую вы вызываете, существует.

0 голосов
/ 12 января 2010

Нет, Java не имеет этой функции. Во-первых, я думаю, что это сделает перегрузку практически невозможной (некоторые утверждают, что перегрузка в любом случае плохая идея, но это не тот форум, на котором можно спорить). Кроме того, я чувствую, что разработчики Java просто чувствуют, что гибкость чего-то подобного (я знаю это по Perl, где он называется AUTOLOAD) перевешивается гарантией того, что любой код, который компилируется, вызывает только те методы, которые действительно существуют. (исключая двоичные несовместимости).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...