PHP __call等效于java

时间:2010-01-12 16:28:42

标签: java php

__call of PHP是否有Java等价物?

如果情况并非如此,那对我来说是有意义的,因为它可能会导致编译器错误。

来自PHP manual on magic methods

  在对象上下文中调用不可访问的方法时会触发

__call()

5 个答案:

答案 0 :(得分:14)

Java语言不直接支持动态类型语言(如PHP,Python和Ruby)中常见的动态方法/属性解析。

可以使用Dynamic Proxies来近似效果,这需要您拥有一个动态解析实现的接口。诸如CGLIB之类的第三方库允许使用普通的Java类进行类似的操作。

这种基于API,特殊情况下的方法调用拦截不像PHP中的__call或其他动态类型语言中的等效功能(例如{{1})那样直接支持。在Python中)。这种差异是由于在两种语言中处理方法调度的根本不同方式。

答案 1 :(得分:9)

不,没有。

答案 2 :(得分:4)

正如其他人所说,java不支持这一点。

它确实有一个叫做代理类的东西,可以拦截对已知方法的调用(而不是像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's JCIArch4J这样的工具可以为您处理此问题。但是,该类只会包含您指定的方法。

答案 3 :(得分:0)

不,Java没有这个功能。首先,我认为它会使重载几乎不可能(有些人认为重载是一个坏主意,但这不是辩论的正确论坛)。除此之外,我感觉到Java的设计者只是觉得这样的灵活性(我从Perl知道它被称为AUTOLOAD)被所有编译的代码只调用方法的保证所抵消。实际存在(禁止二进制不兼容)。

答案 4 :(得分:0)

不,java是一种编译语言,编译器希望确保您调用的每个函数都存在。