亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

關(guān)于Java中的klass和class

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

Java的klass和class

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

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

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

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

反射也是拿到堆里的Class對(duì)象

所有我們比較兩個(gè)對(duì)象類(lèi)型是否相等,實(shí)際上就是比較兩個(gè)Class對(duì)象是否一樣

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

其中,重點(diǎn)中的重點(diǎn)是Class類(lèi)和Class對(duì)象。這個(gè)概念太容易混淆。

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

確實(shí)很少有文章能講明白

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

先給結(jié)論,每一個(gè)Java類(lèi)都有一個(gè)伴生的Class對(duì)象。

詳細(xì)解釋一下,定義這樣一個(gè)類(lèi):

class Main {
}

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

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)
....
}

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

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

_primary_supers 代表了這個(gè)類(lèi)的父類(lèi)。比如,我們看IOException, 是Exception的子類(lèi),而Exception又是Throwable的子類(lèi)。

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

其他的屬性我們先不看,以后有時(shí)間會(huì)慢慢再來(lái)講。

今天重點(diǎn)說(shuō)一下oop,這個(gè)我猜是ordinary object pointer的縮寫(xiě),到底是什么的縮寫(xiě),其實(shí)我也不確定。

但我能確定的是,這種類(lèi)型代表是一個(gè)真正的Java對(duì)象。比如說(shuō):

Main m = new Main();

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

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

好了。說(shuō)了這么多,才剛來(lái)到我們今天的主題: java_mirror 。不起眼的一行:

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

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

那我們通過(guò)Java代碼能不能訪問(wèn)到這個(gè)背后的對(duì)象呢?你肯定已經(jīng)猜到了,當(dāng)然能啊,這就是Main的class對(duì)象啊。我們上節(jié)課已經(jīng)有兩種寫(xiě)法來(lái)訪問(wèn)它了?。?/p>

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

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

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

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

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

相關(guān)文章

  • Java多線程模擬電影售票過(guò)程

    Java多線程模擬電影售票過(guò)程

    這篇文章主要為大家詳細(xì)介紹了Java多線程模擬電影售票過(guò)程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • MyBatis-Plus 分頁(yè)插件配置的兩種方式實(shí)現(xiàn)

    MyBatis-Plus 分頁(yè)插件配置的兩種方式實(shí)現(xiàn)

    本文主要介紹了MyBatis-Plus 分頁(yè)插件配置的兩種方式實(shí)現(xiàn),包括使用PaginationInterceptor和MybatisPlusInterceptor兩種方式,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • Java中GC的工作原理詳細(xì)介紹

    Java中GC的工作原理詳細(xì)介紹

    這篇文章主要介紹了Java中GC的工作原理詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Java中StopWatch工具類(lèi)的用法詳解

    Java中StopWatch工具類(lèi)的用法詳解

    stopWatch 是org.springframework.util 包下的一個(gè)工具類(lèi),使用它可直觀的輸出代碼執(zhí)行耗時(shí),以及執(zhí)行時(shí)間百分比,下面就跟隨小編一起來(lái)看看它的具體用法吧
    2024-12-12
  • java 中 request.getSession(true、false、null)的區(qū)別

    java 中 request.getSession(true、false、null)的區(qū)別

    這篇文章主要介紹了java 中 request.getSession(true/false/null)的區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Java詳解實(shí)現(xiàn)多線程的四種方式總結(jié)

    Java詳解實(shí)現(xiàn)多線程的四種方式總結(jié)

    哈哈!經(jīng)過(guò)一個(gè)階段的學(xué)習(xí),Java基礎(chǔ)知識(shí)學(xué)習(xí)終于到多線程了!Java多線程以及后面互斥鎖的概念都是Java基礎(chǔ)學(xué)習(xí)的難點(diǎn),所以我做了一個(gè)總結(jié),希望對(duì)大家也有幫助
    2022-07-07
  • Java中super和this的用法詳解

    Java中super和this的用法詳解

    這篇文章主要介紹了Java中super和this的用法詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • SpringBoot屬性注入的多種方式實(shí)例

    SpringBoot屬性注入的多種方式實(shí)例

    在 SpringBoot中,提供了一種新的屬性注入方式,支持各種java基本數(shù)據(jù)類(lèi)型及復(fù)雜類(lèi)型的注入,下面這篇文章主要給大家介紹了關(guān)于SpringBoot屬性注入的多種方式,需要的朋友可以參考下
    2021-10-10
  • 詳解Jenkins 實(shí)現(xiàn)Gitlab事件自動(dòng)觸發(fā)Jenkins構(gòu)建及釘釘消息推送

    詳解Jenkins 實(shí)現(xiàn)Gitlab事件自動(dòng)觸發(fā)Jenkins構(gòu)建及釘釘消息推送

    這篇文章主要介紹了Jenkins 實(shí)現(xiàn)Gitlab事件自動(dòng)觸發(fā)Jenkins構(gòu)建及釘釘消息推送,應(yīng)該會(huì)對(duì)大家學(xué)習(xí)Jenkins有所啟發(fā)
    2021-04-04
  • Fluent Mybatis學(xué)習(xí)之Update語(yǔ)法實(shí)踐

    Fluent Mybatis學(xué)習(xí)之Update語(yǔ)法實(shí)踐

    Fluent MyBatis是一個(gè)MyBatis的增強(qiáng)工具,沒(méi)有對(duì)mybatis做任何修改。本篇文章將詳細(xì)介紹對(duì)Fluent Mybatis中的update語(yǔ)法進(jìn)行驗(yàn)證。代碼具有一定價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下
    2021-11-11

最新評(píng)論