Подтвердить что ты не робот

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

Есть ли эквивалент Java для __ вызов PHP?

Мне было бы разумно, если бы это не так, потому что это могло бы привести к ошибкам компилятора.

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

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

4b9b3361

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