从简化的角度来看,.Net中的所有方法实际上都是静态的。通过将对this
的引用隐式传递给第一个方法参数来调用的实例方法。因此,可以在不实际提供正确实例的情况下调用实例方法,使其行为类似于静态方法。例如。可以通过动态发送string.Equals(string s)
OpCode而不是null.Equals(null)
或手动编写相应的IL代码来将call
称为callvirt
。我记得,如果代码在运行时被jitted,实际上可能遇到这种情况。如果在方法体内未使用this
,则没有问题。
这个东西证明了方法在.Net中实际上是静态的。我想知道Java中是否有类似的技巧。我查看了Method.invoke()
- 在没有正确实例的情况下检查实例方法是否非常彻底,并且保证NullPointerException
为空实例。主要是因为Java中的所有方法都是虚拟的,并且对于虚拟调用,需要正确的类型。
那么,是否有任何技巧方法可以调用实例方法,就好像它在Java中是静态的(可能是由于某些优化,例如,如果运行时只存在一个方法实现,虚拟调用可以更改为非虚拟调用)?或者由于可能存在实例方法而被禁止(类型的每个实例都有自己的方法体,不在它们之间共享)?
答案 0 :(得分:1)
当然不是来自Java代码,没有。
如果您手动滚动字节码,那么也许您可以使用invokestatic
操作来调用实例方法,但这样做的结果并未在JVM规范中定义。不同的JVM实现可以 - 也可能 - 以不同的方式处理它。