2010-01-12 13 views
13

¿Hay un equivalente Java para el __call of PHP?PHP __call equivalente para java

Tendría sentido para mí si ese no fuera el caso, porque probablemente daría lugar a errores de compilación.

Desde el PHP manual on magic methods:

__call() se activa cuando la invocación de métodos de difícil acceso en el contexto de un objeto.

+0

¿Qué hace __call? – Dan

+1

@Dan, consulte http://www.garfieldtech.com/blog/php-magic-call – Kevin

+0

Enlazando https: // stackoverflow.com/q/10226064/632951 – Pacerier

Respuesta

14

Este tipo de resolución dinámica de método/atributo que es común en lenguajes de tipado dinámico, como PHP, Python y Ruby, no se admite directamente en el lenguaje Java.

El efecto se puede aproximar usando Dynamic Proxies que requiere que tenga una interfaz para la cual la implementación se resolverá dinámicamente. Las bibliotecas de terceros como CGLIB permiten hacer cosas similares con las clases Java normales. Esta API, la interceptación de caso especial de invocación de método no es tan conveniente como la directa, siempre en soporte que puede obtener con __call en PHP o características equivalentes en otros lenguajes dinámicos (como __getattr__ en Python). Esta diferencia se debe a las formas fundamentalmente diferentes en que se maneja el envío de métodos en los dos tipos de idiomas.

0

No, Java no tiene esa característica. Por un lado, creo que haría que la sobrecarga sea casi imposible (algunos argumentan que la sobrecarga es una mala idea de todos modos, pero este no es el foro adecuado para ese debate). Más allá de eso, tengo la sensación de que los diseñadores de Java solo sienten que la flexibilidad, algo así (lo sé de Perl, donde se llama AUTOLOAD) se ve compensado por la garantía de que cualquier código que compila solo está llamando a métodos que realmente existen (salvo incompatibilidades binarias).

1

No, Java es un lenguaje compilado y el compilador quiere asegurarse de que todas las funciones que llama realmente existen.

+5

C# 4.0 es un lenguaje compilado con características similares. – jsight

4

como se dijo, java no es compatible con esto.

tiene algo llamado una clase proxy que puede interceptar llamadas a métodos conocidos (en lugar de métodos no definidos como en php's __call()). un proxy puede ser creado dinámicamente como una envoltura alrededor de cualquier interfaz:

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 parece un Foo, pero todas las llamadas son interceptados por el método invoke() de FooImpl.

para crear una verdadera clase de novo en tiempo de ejecución con métodos dinámicos en su interfaz, básicamente puede compilar una definición de clase y usar el cargador de clases de java para importarla en tiempo de ejecución. una herramienta como apache's JCI o Arch4J puede manejar esto por usted. aún así, la clase solo tendrá aquellos métodos que especifique.

Cuestiones relacionadas