java.lang.Class 解析

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;
};
发布了778 篇原创文章 · 获赞 323 · 访问量 209万+

猜你喜欢

转载自blog.csdn.net/lgh1992314/article/details/83859338