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 )被任何编译的代码只调用实际存在的方法的保证所抵消(禁止)二进制不兼容性)。