如何判斷JVM中類和其他類是不是同一個類

如何判斷JVM中的類是否為同一個類

在Java虛擬機(JVM)中,判斷兩個類是否相同需要同時滿足以下三個條件:

1. 類全限定名必須相同

  • 包括包名+類名的完整路徑必須完全一致
  • 例如:java.lang.Stringcom.example.String被視為不同類

2. 加載該類的類加載器必須相同

  • 關鍵原則:JVM用全限定名 + 類加載器作為類的唯一標識
  • 即使相同的.class文件,被不同類加載器加載也會被視為不同類
ClassLoader loader1 = new CustomClassLoader();
ClassLoader loader2 = new CustomClassLoader();Class<?> classA = loader1.loadClass("com.example.Test");
Class<?> classB = loader2.loadClass("com.example.Test");System.out.println(classA == classB); // false,因為類加載器不同

3. 類的二進制表示必須一致

  • 從相同來源加載的字節碼內容必須完全相同
  • 如果.class文件被修改后重新加載,會被視為新類

驗證類相同的實際方法

(1) 直接比較Class對象

if(obj1.getClass() == obj2.getClass()) {// 是同一個類
}

(2) 檢查類名和類加載器

boolean isSameClass(Class<?> c1, Class<?> c2) {return c1.getName().equals(c2.getName()) && c1.getClassLoader() == c2.getClassLoader();
}

特殊場景分析

1. 數組類的唯一性

數組類的類名包含維度信息,且由JVM直接創建:


int[] arr1 = new int[10];
int[] arr2 = new int[20];
System.out.println(arr1.getClass() == arr2.getClass()); // trueString[] strArr1 = new String[10];
System.out.println(arr1.getClass() == strArr1.getClass()); // false

2. 基本數據類型的類

基本類型由JVM預先定義,沒有類加載器:

System.out.println(int.class == Integer.TYPE); // true
System.out.println(int.class.getClassLoader()); // null

3. 動態生成的類

動態代理和Lambda表達式生成的類:

Runnable lambda1 = () -> {};
Runnable lambda2 = () -> {};
System.out.println(lambda1.getClass() == lambda2.getClass()); 
// 可能為true(相同lambda表達式)
// 可能為false(不同捕獲變量時)

類相同性在JVM中的實現原理

JVM內部使用類元數據(Class Metadata)**和**類加載器的組合作為唯一鍵:

  1. 每個類加載器維護自己的命名空間
  2. 類加載時檢查是否已存在同名類的定義
  3. 如果存在且加載器相同,則直接返回已有Class對象

常見誤區

  1. 認為類名相同就是同一個類

    • 忽略了類加載器的影響
    • 例如:Tomcat中不同Web應用的同名類不是同一個類
  2. 認為instanceof檢查類相同性

    // instanceof會考慮繼承關系
    Object str = "hello";
    System.out.println(str instanceof CharSequence); // true
    // 但String和CharSequence不是同一個類
    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/74812.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74812.shtml
英文地址,請注明出處:http://en.pswp.cn/web/74812.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ifconfig 使用詳解

目錄 一、基本語法二、常見用途及示例1. 查看所有網絡接口信息2. 啟用/禁用網絡接口3. 配置 IP 地址和子網掩碼4. 修改 MAC 地址5. 啟用混雜模式&#xff08;Promiscuous Mode&#xff09;6. 設置 MTU&#xff08;最大傳輸單元&#xff09; 三、其他選項四、常見問題1. 新系統中…

1. 標準庫的強依賴(核心原因)

1. 標準庫的強依賴&#xff08;核心原因&#xff09; 容器操作&#xff08;如 std::vector 擴容&#xff09; 當標準庫容器&#xff08;如 std::vector&#xff09;需要重新分配內存時&#xff0c;它會嘗試移動現有元素到新內存&#xff0c;而非拷貝&#xff08;為了性能&…

【MySQL】常用SQL--持續更新ing

一、配置信息類 1.查看版本 select version; 或 select version(); 2.查看配置 show global variables where variable_name in (basedir,binlog_format,datadir,expire_logs_days,innodb_buffer_pool_size,innodb_log_buffer_size,innodb_log_file_size,innodb_log_files_i…

Day82 | 靈神 | 快慢指針 重排鏈表

Day82 | 靈神 | 快慢指針 重排鏈表 143.重排鏈表 143. 重排鏈表 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 筆者直接給跪了&#xff0c;這個難度真是mid嗎 直接去看靈神的視頻 環形鏈表II【基礎算法精講 07】_嗶哩嗶哩_bilibili 1.簡單來說就是&#xf…

常見的微信個人號二次開發功能

一、常見開發功能 1. 好友管理 好友列表維護 添加/刪除好友 修改好友信息&#xff08;備注、標簽等&#xff09; 分組管理 創建/編輯/刪除標簽 好友分類與篩選 2. 消息管理 信息發送 支持多類型內容&#xff1a;文本、圖片、視頻、文件、小程序、名片、URL鏈接等 附加功…

Android打包及上架應用市場問題處理

一、Gradle 配置參數含義&#xff1a; compileSdkVersion: 29 表示項目編譯時使用的 Android SDK 版本為 API 29&#xff08;Android 10&#xff09;&#xff0c;僅影響編譯階段的行為&#xff08;如代碼語法檢查、資源處理等&#xff09;&#xff0c;不直接影響運行時兼容性。…

Docker 從入門到進階 (Win 環境) + Docker 常用命令

目錄 引言 一、準備工作 1.1 系統要求 1.2 啟用虛擬化 二、安裝Docker 2.1 安裝WSL 2 2.2 安裝Docker Desktop 2.3檢查是否安裝成功 三、配置Docker 3.1 打開Docker配置中心 四、下載和管理Docker鏡像 4.1 拉取鏡像 4.2 查看已下載的鏡像 4.3 運行容器 4.4 查看正…

計算機視覺5——運動估計和光流估計

一、運動估計 &#xff08;一&#xff09;運動場&#xff08;Motion Field&#xff09; 定義與物理意義 運動場是三維場景中物體或相機運動在二維圖像平面上的投影&#xff0c;表現為圖像中每個像素點的運動速度矢量。其本質是場景點三維運動&#xff08;平移、旋轉、縮放等&a…

介質訪問控制——信道劃分

什么是介質訪問 介質訪問&#xff08;Medium Access&#xff09;? 是計算機網絡中一種規則&#xff0c;用來解決 ??“多臺設備如何共享同一根網線/信道傳輸數據”? 的問題。你可以理解為&#xff1a; 想象一條只能容一輛車通過的獨木橋&#xff08;網絡中的網線、Wi-Fi信道…

ERP系統五大生產模式概述

制造業中,選擇合適的生產模式是企業高效運營的關鍵。 以下是ERP系統支持的五大核心生產模式及其特點總結: 1. MTS(按庫存生產) - 定義:先生產后銷售,基于需求預測提前備貨。 - 適用場景:需求穩定、標準化程度高的產品(如日用品、家電)。 - 優點:交貨快、生產…

ubantu操作筆記

安裝ssh服務 1.1 基本安裝 sudo apt update sudo apt install openssh-server -y sudo systemctl start ssh sudo systemctl enable ssh 1.2 配置遠程root登陸 # 0. 設置root密碼 sudo passwd root # 1. 安裝vim依賴 sudo apt-get install vim -y # 2. 編輯配置文件 s…

2-vim編輯器的安裝和使用

一.常用工具介紹 前言&#xff1a; 我們想要編寫c語言代碼&#xff0c;可以使用linux系統提供的工具才能進行代碼的編輯。代碼編寫后&#xff0c;我們還需要驗證代碼的書寫正確。這就需要借助編譯器來進行驗證。linux系統為我們提供了比較好的開發工具。 vim編輯器&#xff…

小剛說C語言刷題——第16講 switch語句

在日常生活中&#xff0c;我們經常會遇到多分支的情況。當分支較多時&#xff0c;我們可以用嵌套的if-else語句。但是這樣會讓結構顯得混亂。這個時候我們可以考慮用switch語句。 1.語法格式 switch (表達式) { case 常量表達式1&#xff1a; 語句1; break; case 常量表達式…

使用 Python 連接 PostgreSQL 數據庫,從 `mimic - III` 數據庫中篩選數據并導出特定的數據圖表

要使用 Python 連接 PostgreSQL 數據庫&#xff0c;從 mimic - III 數據庫中篩選數據并導出特定的數據圖表&#xff0c;你可以按照以下步驟操作&#xff1a; 安裝所需的庫&#xff1a;psycopg2 用于連接 PostgreSQL 數據庫&#xff0c;pandas 用于數據處理&#xff0c;matplot…

過孔的載流能力

PCB過孔的載流能力&#xff08;即能安全承載的電流大小&#xff09;主要與以下因素相關&#xff1a; 1. 過孔的尺寸 孔徑&#xff08;直徑&#xff09;&#xff1a;孔徑越大&#xff0c;橫截面積越大&#xff0c;載流能力越強。 孔壁銅厚&#xff1a;電鍍銅的厚度&#xff08…

(done) 并行計算 CS149 Lecture2 (現代多核處理器) (SIMD, 多核, 超標量, 數據預取, 超線程)

視頻 url: https://www.bilibili.com/video/BV1du17YfE5G?spm_id_from333.788.videopod.sections&vd_source7a1a0bc74158c6993c7355c5490fc600&p2 大佬筆記 url: https://zhuanlan.zhihu.com/p/8129089606 先看視頻&#xff1a; Lecture 0 ~ 28min 的內容基本就是 c…

Leetcode 3508. Implement Router

Leetcode 3508. Implement Router 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3508. Implement Router 1. 解題思路 這一題就是按照題意寫作一下對應的函數即可。 我們需要注意的是&#xff0c;這里&#xff0c;定義的類當中需要包含以下一些內容&#xff1a; 一個所有i…

Linux: 系統內核中的信號

目錄 一 前言 二 信號在內核中的表示 三 sigset_t 四 信號集操作 1. sigpending() 2. sigemptyset() 3. sigfillset() 4. sigaddset ()和sigdelset() 5. sigismember() 6. sigprocmask() 五 深入理解信號的捕捉流程 一 前言 在Linux: 進程信號初識-CSDN博客信…

Nginx-keepalived-高可用

Nginx 高可用 通常 借助 Keepalived 實現&#xff0c; Keepalived 能通過 VRRP &#xff08;虛擬路由冗余協議&#xff09;讓多個 Nginx 服務器 組成一個 熱備集群&#xff0c;當主服務器故障時自動切換到備用服務器&#xff0c;保障服務不間斷。 一、環境準備 角色IP 地址主…

使用python完成手寫數字識別

入門圖像識別的第一個案例,看到好多小伙伴分享,也把自己當初的思路捋捋,寫成一篇博客,作為記錄和分享,也歡迎各位交流討論。 實現思路 數據集:MNIST(包含60,000個訓練樣本和10,000個測試樣本) 深度學習框架:Keras(基于TensorFlow) 模型架構:卷積神經網絡(CNN) 實…