gpt4 book ai didi

java - 通过反射像调用静态方法一样调用实例方法

转载 作者:行者123 更新时间:2023-11-30 08:19:21 25 4
gpt4 key购买 nike

从简化的角度来看,.Net 中的所有方法实际上都是静态的。通过将 this 的引用隐式传递给第一个方法参数来调用实例方法。因此,可以在不实际提供正确实例的情况下调用实例方法,使其行为类似于静态方法。例如。可以通过动态发出 call OpCode 而不是 string.Equals(string s) 调用为 null.Equals(null) >callvirt 或者手动编写相应的IL代码。我记得,如果代码在运行时被抖动,这种情况可能实际上会遇到。如果方法体内不使用 this 也不会出现问题。
这个东西证明了 .Net 中的方法实际上是静态的。我想知道Java中是否有类似的技巧。我已经查看了 Method.invoke() ,它非常彻底地检查实例方法是否在没有正确实例的情况下不会被调用,并且对于空实例保证了 NullPointerException 。主要是因为 Java 中的所有方法都是虚拟的,并且对于虚拟调用,需要正确的类型。
那么,有没有什么技巧可以让实例方法像Java中的静态方法一样调用(可能是由于一些优化,例如,如果运行时只存在一种方法实现,则可以将虚拟调用更改为非虚拟调用)?或者由于可能存在真实实例方法而被禁止(每个类型的实例都有该方法自己的方法体,而不是在它们之间共享)?

最佳答案

当然不是来自 Java 代码,不是。

如果您手动滚动字节码,那么也许您可以使用 invokestatic 操作来调用实例方法,但这样做的结果并未在 JVM 规范中定义。不同的 JVM 实现可以——而且可能确实——以不同的方式处理它。

关于java - 通过反射像调用静态方法一样调用实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29172657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com