[英]Invoking instance method as if it was static through reflection
从简化的角度来看,.Net中的所有方法实际上都是静态的。 通过隐式地将this
引用传递给第一个方法参数来调用实例方法。 因此,可以在不实际提供正确实例的情况下调用实例方法,使其行为类似于静态方法。 例如,可以通过动态发出call
OpCode而不是callvirt
来调用string.Equals(string s)
为null.Equals(null)
或callvirt
编写相应的IL代码。 我记得,如果在运行时添加代码,可能会遇到这种情况。 如果就没有问题, this
是不是方法体中使用。
这件事证明了.Net中的方法实际上是静态的。 我想知道Java中是否有类似的技巧。 我已经仔细研究过Method.invoke()
-检查是否没有正确的实例就不会调用实例方法是非常彻底的,并且为空实例保证了NullPointerException
。 主要是因为Java中的所有方法都是虚拟的,对于虚拟调用,需要正确的类型。
因此,是否有任何技巧可以像在Java中那样将其实例化为静态方法(可能是由于某种优化,例如,如果运行时仅存在一个方法实现,则可以将虚拟调用更改为非虚拟调用)? 还是由于可能存在实实例方法而被禁止(每个类型的实例都具有该方法的自身方法主体,而不在它们之间共享)?
当然不是来自Java代码,不是。
如果您手动滚动字节码,那么也许可以使用invokestatic
操作来调用实例方法,但是这样做的结果未在JVM规范中定义。 不同的JVM实现可以并且可能会以不同的方式处理它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.