getClass()是如何在java中实现的?

bat*_*man 7 java

我有这样的代码:

public class QueueSample {

    public static void main(String[] args) {
        System.out.println(new QueueSample().getClass());
    }

}
Run Code Online (Sandbox Code Playgroud)

它打印:

class QueueSample
Run Code Online (Sandbox Code Playgroud)

getClass()方法来自Object班级.看一下源代码Object,我只能看到这样的方法定义:

public final native Class<?> getClass();
Run Code Online (Sandbox Code Playgroud)

如果没有在这里实现,这个方法在哪里以及如何实现?

And*_*ter 6

正如@TheLostMind所提到的,您可以从OpenJDK获取源代码 - 查看更新版本(JDK9),本getClass()机方法实现如下

JNIEXPORT jclass JNICALL
Java_java_lang_Object_getClass(JNIEnv *env, jobject this)
{
    if (this == NULL) {
        JNU_ThrowNullPointerException(env, NULL);
        return 0;
    } else {
        return (*env)->GetObjectClass(env, this);
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,它本质上所做的是委托JVM的环境并使用该GetObjectClass()函数返回Class对象.您可以将此作为起点 - 如果您想深入了解,我建议您使用mercurial 从http://hg.openjdk.java.net/查看JDK源代码,以便您可以浏览它.

正如@Holger所提到的,在使用热点等JIT编译器时会有一些性能优化 - 例如,Hotspot JVM中使用的性能技术称" Object.getClass()是一个或两个指令".这意味着上面的代码显示了一个可能的实现Object.getClass(),但是这个实现可能在运行时和/或基于实际的JVM(解释/ JITted,客户端/服务器,Oracle标准/ JRockit,......)时发生变化.

  • 这是可以在解释模式下调用的“普通代码”。热点优化器很可能知道“getClass()”方法,并在它出现在热点中时将其替换为其他方法,使用调用的周围上下文来预测结果并查看您实际上对结果做了什么。请参阅 https://wikis.oracle.com/display/HotSpotInternals/PerformanceTechniques#PerformanceTechniques-Intrinsics (2认同)