最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關于Java中的klass和class

 更新時間:2023年08月30日 09:44:36   作者:云川之下  
這篇文章主要介紹了關于Java中klass和class的區(qū)別,vm加載的字節(jié)碼,也就是.class文件,被加載到方法區(qū)里面,叫Kclass,是一個C++對象,含有類的信息、虛方法表等,需要的朋友可以參考下

Java的klass和class

vm加載的字節(jié)碼,也就是.class文件,被加載到方法區(qū)里面,叫Kclass,是一個C++對象,含有類的信息、虛方法表等

下文中說的mirror是指,JVM在加載了字節(jié)碼后,在堆里創(chuàng)建的Class對象,這個對象和方法區(qū)的Kclass相互指向,也就是說我們可以通過Kclass找到這個對象

我們new 一個對象,對象頭里面會有一個指針,指向方法區(qū)的Kclass

new Object().getClass()流程, 對象頭里面的指針–>方法區(qū)kClass–>堆Class對象

反射也是拿到堆里的Class對象

所有我們比較兩個對象類型是否相等,實際上就是比較兩個Class對象是否一樣

本節(jié)課,我們深入地理解一下反射中使用的Class類,Method類,F(xiàn)ield類這三個類。

其中,重點中的重點是Class類和Class對象。這個概念太容易混淆。

我在寫這篇文章之前,先在網(wǎng)上搜了一下,發(fā)現(xiàn)沒有一篇文章是能講得很清楚的。

確實很少有文章能講明白

知乎上有很多大牛,關于Class對象也曾留下過只言片語,但又不夠系統(tǒng),因為對于這些進行JVM開發(fā)的牛人而言,Class對象是一個不屑于說的問題。但就是在這樣的,開發(fā)者有點糊涂,大牛覺得不重要的地方,才容易產(chǎn)生知識的死角。而且網(wǎng)上有很多錯誤的概念,以訛傳訛,更加容易讓新手們搞不清楚。

先給結(jié)論,每一個Java類都有一個伴生的Class對象。

詳細解釋一下,定義這樣一個類:

class Main {
}

那么當這個類所在的文件被加載,更準確地說,這個類被ClassLoader加載到JVM中的時候,Hotspot虛擬機會為這個類在虛擬機內(nèi)部創(chuàng)建一個叫做Klass的數(shù)據(jù)結(jié)構:

class Klass : public Metadata {
  friend class VMStructs;
 protected:
  // note: put frequently-used fields together at start of klass structure
  // for better cache behavior (may not make much of a difference but sure won't hurt)
  enum { _primary_super_limit = 8 };
  jint        _layout_helper;
  juint       _super_check_offset;
  Symbol*     _name;
  Klass*      _secondary_super_cache;
  // Array of all secondary supertypes
  Array<Klass*>* _secondary_supers;
  // Ordered list of all primary supertypes
  Klass*      _primary_supers[_primary_super_limit];
  // java/lang/Class instance mirroring this class
  oop       _java_mirror;
  // Superclass
  Klass*      _super;
  // First subclass (NULL if none); _subklass->next_sibling() is next one
  Klass*      _subklass;
  // Sibling link (or NULL); links all subklasses of a klass
  Klass*      _next_sibling;
  Klass*      _next_link;
  // The VM's representation of the ClassLoader used to load this class.
  // Provide access the corresponding instance java.lang.ClassLoader.
  ClassLoaderData* _class_loader_data;
  jint        _modifier_flags;  // Processed access flags, for use by Class.getModifiers.
  AccessFlags _access_flags;    // Access flags. The class/interface distinction is stored here.
  // Biased locking implementation and statistics
  // (the 64-bit chunk goes first, to avoid some fragmentation)
  jlong    _last_biased_lock_bulk_revocation_time;
  markOop  _prototype_header;   // Used when biased locking is both enabled and disabled for this type
  jint     _biased_lock_revocation_count;
  TRACE_DEFINE_KLASS_TRACE_ID;
  // Remembered sets support for the oops in the klasses.
  jbyte _modified_oops;             // Card Table Equivalent (YC/CMS support)
  jbyte _accumulated_modified_oops; // Mod Union Equivalent (CMS support)
....
}

這個類的完整定義,大家可以去看hotspot/src/share/vm/oops/klass.hpp, 我們這里就不再多列了。這些屬性已經(jīng)足夠我們講解的了。

如果Main class被加載,那么虛擬機內(nèi)部就會為它創(chuàng)建一個 Klass ,它的 _name 屬性就是字符串 “Main”。

_primary_supers 代表了這個類的父類。比如,我們看IOException, 是Exception的子類,而Exception又是Throwable的子類。

那么,如果你去看IOException的 _primary_supers 屬性就會發(fā)現(xiàn),它是這樣的:[Throwable, Exception, IOException],后面5位為空。

其他的屬性我們先不看,以后有時間會慢慢再來講。

今天重點說一下oop,這個我猜是ordinary object pointer的縮寫,到底是什么的縮寫,其實我也不確定。

但我能確定的是,這種類型代表是一個真正的Java對象。比如說:

Main m = new Main();

這行語句里創(chuàng)建的 m 在JVM中,就是一個oop,是一個普通的Java對象,而Main在JVM里則是一個Klass。

大家理清了這里面的關系了嗎?我建議沒看懂的,再多看一遍。一般地來說,我不是很鼓勵新手學習JVM源代碼。但是有一些核心概念,如果能加以掌握的話,還是有利于快速掌握概念的本質(zhì)的。

好了。說了這么多,才剛來到我們今天的主題: java_mirror 。不起眼的一行:

 // java/lang/Class instance mirroring this class
  oop       _java_mirror;

注釋說得很清楚了,這個屬性代表的就是本class的Class對象。舉例來說,如果JVM加載了Main這個類,那么除了為Main創(chuàng)建了一個名為"Main"的Klass,還默默地背后創(chuàng)建一個object,并且把這個object 掛到了 Klass 的 _java_mirror 屬性上了。

那我們通過Java代碼能不能訪問到這個背后的對象呢?你肯定已經(jīng)猜到了,當然能啊,這就是Main的class對象啊。我們上節(jié)課已經(jīng)有兩種寫法來訪問它了?。?/p>

Class m = Main.class;
Class m = Class.forName("Main");

這兩種方法都能訪問到Main的Class object,也就是 Klass 上那個不起眼的 _java_mirror 。那么這個_java_mirror上定義的 newInstance 方法,其實最終也是通過JVM中的方法來創(chuàng)建真正的對象:

JVM_ENTRY(jobject, JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0))
  JVMWrapper("JVM_NewInstanceFromConstructor");
  oop constructor_mirror = JNIHandles::resolve(c);
  objArrayHandle args(THREAD, objArrayOop(JNIHandles::resolve(args0)));
  oop result = Reflection::invoke_constructor(constructor_mirror, args, CHECK_NULL);
  jobject res = JNIHandles::make_local(env, result);
  if (JvmtiExport::should_post_vm_object_alloc()) {
    JvmtiExport::post_vm_object_alloc(JavaThread::current(), result);
  }
  return res; 
JVM_END

這個函數(shù)到這里我們就不再往下追了,只要知道JVM可以通過 java_mirror 找到真正的 Klass ,然后再用這個 Klass 創(chuàng)建一個真正的對象就可以了。

到此這篇關于關于Java中的klass和class的文章就介紹到這了,更多相關Java的klass和class內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java實現(xiàn)Redis分布式鎖的三種方案匯總

    Java實現(xiàn)Redis分布式鎖的三種方案匯總

    setnx、Redisson、RedLock?都可以實現(xiàn)分布式鎖,從易到難得排序為:setnx?<?Redisson?<?RedLock,本文為大家整理了三種方法的實現(xiàn),希望對大家有所幫助
    2023-11-11
  • Fluent Mybatis學習之Update語法實踐

    Fluent Mybatis學習之Update語法實踐

    Fluent MyBatis是一個MyBatis的增強工具,沒有對mybatis做任何修改。本篇文章將詳細介紹對Fluent Mybatis中的update語法進行驗證。代碼具有一定價值,感興趣的小伙伴可以學習一下
    2021-11-11
  • 實例詳解SpringMVC入門使用

    實例詳解SpringMVC入門使用

    大家好,本篇文章主要講的是實例詳解SpringMVC入門使用,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • SpringBoot讀取多環(huán)境配置文件的幾種方式

    SpringBoot讀取多環(huán)境配置文件的幾種方式

    這篇文章主要給大家介紹了SpringBoot讀取多環(huán)境配置文件的幾種方式,文章通過代碼示例介紹的非常詳細,具有一定的參考價值,需要的朋友可以參考下
    2023-10-10
  • Spring中@Scope注解用法解析

    Spring中@Scope注解用法解析

    這篇文章主要介紹了Spring中@Scope注解用法解析,@Scope注解主要作用是調(diào)節(jié)Ioc容器中的作用域,在Spring IoC容器中主要有以下五種作用域,需要的朋友可以參考下
    2023-11-11
  • java Aop實現(xiàn)自動填充字段值示例

    java Aop實現(xiàn)自動填充字段值示例

    這篇文章主要為大家介紹了Aop實現(xiàn)自動填充字段值示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Mybatis如何開啟控制臺打印sql語句

    Mybatis如何開啟控制臺打印sql語句

    在SpringBoot與Mybatis整合開發(fā)中,開啟控制臺SQL語句打印是一個常見需求,有助于調(diào)試與性能優(yōu)化,方法一:在Mybatis配置文件mybatis-config.xml中添加設置;方法二:在SpringBoot配置文件application.yml或properties中
    2024-11-11
  • SpringBoot靜態(tài)函數(shù)無法自動注入Bean的原因分析與解決方案

    SpringBoot靜態(tài)函數(shù)無法自動注入Bean的原因分析與解決方案

    在 Spring Boot 項目中,開發(fā)者常遇到一個典型問題:在靜態(tài)方法或靜態(tài)變量中嘗試使用 @Autowired 注入 Bean 時,始終得到 null 值,本文將深入剖析這一問題的根源,并提供多種可靠解決方案,需要的朋友可以參考下
    2025-08-08
  • Java中的WeakHashMap詳解

    Java中的WeakHashMap詳解

    這篇文章主要介紹了Java中的WeakHashMap詳解,WeakHashMap可能平時使用的頻率并不高,但是你可能聽過WeakHashMap會進行自動回收吧,下面就對其原理進行分析,需要的朋友可以參考下
    2023-09-09
  • Springboot+Mybatis+logback打印sql腳本日志實現(xiàn)過程

    Springboot+Mybatis+logback打印sql腳本日志實現(xiàn)過程

    在SpringBoot項目中,通過配置`application.yml`和`logback-spring.xml`文件,可以在控制臺和日志文件中打印SQL腳本日志,關鍵在于配置logback-spring.xml中的`name`屬性為mapper類所在路徑
    2026-01-01

最新評論

阜平县| 江西省| 辉县市| 宣城市| 沂源县| 普定县| 双桥区| 江陵县| 来凤县| 樟树市| 通辽市| 三河市| 会理县| 明水县| 南漳县| 顺平县| 华容县| 西宁市| 普陀区| 巴中市| 辽阳县| 琼海市| 酉阳| 沭阳县| 合作市| 莱州市| 华池县| 嘉荫县| 永嘉县| 苍南县| 义乌市| 方山县| 宁晋县| 南皮县| 台北县| 丰台区| 泊头市| 米林县| 夹江县| 平江县| 建湖县|