__call of PHP是否有Java等价物?
如果情况并非如此,那对我来说是有意义的,因为它可能会导致编译器错误。
来自PHP manual on magic methods:
在对象上下文中调用不可访问的方法时会触发
__call()
。
答案 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 JCI或Arch4J这样的工具可以为您处理此问题。但是,该类只会包含您指定的方法。
答案 3 :(得分:0)
不,Java没有这个功能。首先,我认为它会使重载几乎不可能(有些人认为重载是一个坏主意,但这不是辩论的正确论坛)。除此之外,我感觉到Java的设计者只是觉得这样的灵活性(我从Perl知道它被称为AUTOLOAD
)被所有编译的代码只调用方法的保证所抵消。实际存在(禁止二进制不兼容)。
答案 4 :(得分:0)
不,java是一种编译语言,编译器希望确保您调用的每个函数都存在。