demo

GetClassDemo demo = new GetClassDemo();
Class clazz = demo.getClass(); // 初始化的class
System.out.println("clazz="+clazz);

Object

native方法

public final native Class<?> getClass();


openjdk8\jdk\src\share\native\java\lang\Object.c

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); //todo getClass()
}
}

jni_GetObjectClass

openjdk8\hotspot\src\share\vm\prims\jni.cpp

JNIWrapper("GetObjectClass");
JNI_ENTRY(jclass, jni_GetObjectClass(JNIEnv *env, jobject obj))
#ifndef USDT2
DTRACE_PROBE2(hotspot_jni, GetObjectClass__entry, env, obj);
#else /* USDT2 */
HOTSPOT_JNI_GETOBJECTCLASS_ENTRY(
env, obj);
#endif /* USDT2 */
Klass* k = JNIHandles::resolve_non_null(obj)->klass(); /* 根据传入的java对象引用找到引用对象然后找到该对象类型的元数据 */
jclass ret =
(jclass) JNIHandles::make_local(env, k->java_mirror()); /*根据元数据找到java_mirror,也就是java程序中的Class对象实例*/ //jniHandles.cpp:63
#ifndef USDT2
DTRACE_PROBE1(hotspot_jni, GetObjectClass__return, ret);
#else /* USDT2 */
HOTSPOT_JNI_GETOBJECTCLASS_RETURN(
ret);
#endif /* USDT2 */
return ret;
JNI_END

resolve_non_null

openjdk8\hotspot\src\share\vm\runtime\jniHandles.hpp

inline oop JNIHandles::resolve_non_null(jobject handle) {
oop result = *(oop*)handle;
return result;
};