PHP的__call相当于java
PHP的__call是否有Java等价物?
如果情况并非如此,那对我来说是有意义的,因为它可能会导致编译器错误。
从魔法方法的PHP手册 :
在对象上下文中调用不可访问的方法时会触发
__call()
。
Java语言不直接支持动态类型语言(如PHP,Python和Ruby)中常见的这种动态方法/属性解析。
可以使用动态代理来近似效果, 动态代理需要您具有动态解析实现的接口。 诸如CGLIB之类的第三方库允许使用普通Java类进行类似的操作。
这种基于API,特殊情况下的方法调用拦截不如直接,永远在线支持,您可以使用PHP中的__call
或其他动态类型语言中的等效function(例如Python中的__getattr__
)。 这种差异是由于在两种语言中处理方法分派的根本不同方式。
不,那里没有。
正如其他人所说,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的JCI或Arch4J这样的工具可以为你处理这个问题。 但是,该类只会包含您指定的方法。
不,java是一种编译语言,编译器希望确保您调用的每个函数都存在。
不,Java没有这个function。 首先,我认为它会使重载几乎不可能(有些人认为重载是一个坏主意,但这不是辩论的正确论坛)。 除此之外,我感觉Java的设计者只是觉得这样的灵活性(我从Perl知道,它被称为AUTOLOAD
)被任何编译的代码只调用实际存在的方法的保证所抵消(禁止)二进制不兼容性)。