我有这样的代码:
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)
如果没有在这里实现,这个方法在哪里以及如何实现?
正如@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,......)时发生变化.