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

时间:2014-10-29 09:04:23

标签: java

我有这样的代码:

public class QueueSample {

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

}

打印:

class QueueSample

getClass()方法来自Object类。查看Object的源代码,我只能看到这样的方法定义:

public final native Class<?> getClass();

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

1 个答案:

答案 0 :(得分:6)

正如@TheLostMind所提到的,您可以从OpenJDK获取源代码 - 查看有点newer version (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);
    }
}

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

正如@Holger所提到的,在使用JTP编译器(如热点)时会有一些性能优化 - 例如,Performance techniques used in the Hotspot JVM表示&#34; Object.getClass()是一个或两个指令。&#34; 。这意味着上面的代码显示了Object.getClass()的一种可能实现,但是这个实现可能在运行时和/或基于实际的JVM(解释/ JITted,客户端/服务器,Oracle标准/ JRockit,... 。)