public final class Class<T> implements java.io.Serializable,
GenericDeclaration,
Type,
AnnotatedElement {}
创建 Class 实例
- XXX.class;
- Object.getClass();
- Class.forName();
- ClassLoader.loadClass();
Class 实例保存在哪
JDK8 移除了永久代,转而使用元空间来实现方法区,创建的 Class 实例在 java heap 中。这更加符合了 jvm 对于堆的定义。
The Java Virtual Machine has a heap that is shared among all Java Virtual Machine threads. The heap is the run-time data area from which memory for all class instances and arrays is allocated.
Object.getClass()
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);
}
}
src\share\vm\prims\jni.cpp
JNI_ENTRY(jclass, jni_GetObjectClass(JNIEnv *env, jobject obj))
JNIWrapper("GetObjectClass");
#ifndef USDT2
DTRACE_PROBE2(hotspot_jni, GetObjectClass__entry, env, obj);
#else /* USDT2 */
HOTSPOT_JNI_GETOBJECTCLASS_ENTRY(env, obj);
#endif /* USDT2 */
/* 根据传入的java对象引用找到引用对象然后找到该对象类型的元数据 */
Klass* k = JNIHandles::resolve_non_null(obj)->klass();
/* 根据元数据找到其镜像,也就是 java 程序中的 Class 对象实例 */
jclass ret = (jclass) JNIHandles::make_local(env, k->java_mirror());
#ifndef USDT2
DTRACE_PROBE1(hotspot_jni, GetObjectClass__return, ret);
#else /* USDT2 */
HOTSPOT_JNI_GETOBJECTCLASS_RETURN(ret);
#endif /* USDT2 */
return ret;
JNI_END
src\share\vm\runtime\jniHandles.hpp
inline oop JNIHandles::resolve_non_null(jobject handle) {
assert(handle != NULL, "JNI handle should not be null");
oop result = *(oop*)handle;
assert(result != NULL, "Invalid value read from jni handle");
assert(result != badJNIHandle, "Pointing to zapped jni handle area");
// Don't let that private _deleted_handle object escape into the wild.
assert(result != deleted_handle(), "Used a deleted global handle.");
return result;
};