SearchClassUtil

路徑掃描工具SearchClassUtil,用于掃描指定包(XXXX)下的所有.class文件,并將它們的全限定類名(如tomcat.SearchClassUtil)收集到列表中返回。該工具使用遞歸文件遍歷和反射機制,是實現 Spring 框架組件掃描、Servlet 容器類加載等功能的基礎。

完整代碼:

package tomcat;import java.io.File;
import java.util.ArrayList;
import java.util.List;/*
* 掃描包下的文件,獲取全路徑名
* */
public class SearchClassUtil {public static List<String> classPaths = new ArrayList<String>();public static List<String> searchClass(){//需要掃描的包名String basePack = "tomcat";//將獲取到的包名轉換為路徑String classPath = SearchClassUtil.class.getResource("/").getPath();basePack =  basePack.replace(".", File.separator);String searchPath = classPath + basePack;doPath(new File(searchPath),classPath);//這個時候我們已經得到了指定包下所有的類的絕對路徑了。我們現在利用這些絕對路徑和java的反射機制得到他們的類對象return classPaths;}/*** 該方法會得到所有的類,將類的絕對路徑寫入到classPaths中* @param file*/private static void doPath(File file,String classpath) {if (file.isDirectory()) {//文件夾//文件夾我們就遞歸File[] files = file.listFiles();for (File f1 : files) {doPath(f1,classpath);}} else {//標準文件//標準文件我們就判斷是否是class文件if (file.getName().endsWith(".class")) {String path = file.getPath().replace(classpath.replace("/","\\").replaceFirst("\\\\",""),"").replace("\\",".").replace(".class","");//如果是class文件我們就放入我們的集合中。classPaths.add(path);}}}public static void main(String[] args) {List<String> classes = SearchClassUtil.searchClass();for (String s: classes) {System.out.println(s);}}
}

代碼逐行解釋

1. 類定義與成員變量

public class SearchClassUtil {public static List<String> classPaths = new ArrayList<String>();
}
  • 功能:定義工具類,使用靜態列表存儲掃描到的類名。
  • 注意點:靜態變量會在多次調用時累積結果,需手動清空或改進為非靜態設計。

2.?searchClass()?方法

public static List<String> searchClass(){String basePack = "tomcat";String classPath = SearchClassUtil.class.getResource("/").getPath();basePack =  basePack.replace(".", File.separator);String searchPath = classPath + basePack;doPath(new File(searchPath),classPath);return classPaths;
}
  • 功能:入口方法,初始化掃描參數并啟動遞歸掃描
  • 步驟分解
    1. 設置掃描包名basePack = "tomcat"?硬編碼掃描目標包。
    2. 獲取類路徑根目錄
      SearchClassUtil.class.getResource("/").getPath()
      
      ?
      • 返回當前類所在的類路徑根(如/target/classes/或 JAR 包路徑)。
      • 示例:若類位于tomcat/SearchClassUtil.class,則返回/path/to/classes/
    3. 轉換包名為路徑格式
      basePack.replace(".", File.separator)
      
      ?
      • 將包名(如tomcat.util)轉換為文件路徑(如tomcat/util)。
      • 使用File.separator確保跨平臺兼容性(Windows 為\,Linux 為/)。
    4. 拼接完整搜索路徑
      String searchPath = classPath + basePack;
      
      ?
      • 示例:拼接后為/path/to/classes/tomcat/
    5. 啟動遞歸掃描
      doPath(new File(searchPath), classPath);
      
      ?
      • 傳遞搜索目錄和類路徑根目錄。

3.?doPath(File file, String classpath)?方法

private static void doPath(File file, String classpath) {if (file.isDirectory()) {File[] files = file.listFiles();for (File f1 : files) {doPath(f1, classpath);}} else {if (file.getName().endsWith(".class")) {String path = file.getPath().replace(classpath.replace("/","\\").replaceFirst("\\\\",""),"").replace("\\",".").replace(".class","");classPaths.add(path);}}
}
  • 功能:遞歸遍歷文件系統,提取類名并存儲到列表。
  • 邏輯分解
    1. 目錄處理
      if (file.isDirectory()) { ... }
      
      ?
      • 遞歸調用doPath處理子文件 / 目錄。
    2. 文件處理
      if (file.getName().endsWith(".class")) { ... }
      
      ?
      • 篩選.class文件。
    3. 路徑處理
      String path = file.getPath().replace(classpath.replace("/","\\").replaceFirst("\\\\",""),"").replace("\\",".").replace(".class","");
      
      ?
      • 復雜替換邏輯詳解
        1. classpath.replace("/","\\").replaceFirst("\\\\","")
          • 將類路徑(如/path/to/classes/)轉換為系統路徑格式(如path\to\classes\)。
          • 示例:輸入/C:/path/to/classes/?→ 輸出C:\path\to\classes\
        2. file.getPath().replace(...)
          • 移除類路徑前綴,保留相對路徑。
          • 示例:原路徑C:\path\to\classes\tomcat\MyClass.class?→?tomcat\MyClass.class
        3. replace("\\",".")
          • 將路徑分隔符轉換為.,形成類名格式。
          • 示例tomcat\MyClass.class?→?tomcat.MyClass.class
        4. replace(".class","")
          • 移除文件擴展名,得到全限定類名。
          • 示例tomcat.MyClass.class?→?tomcat.MyClass

4.?main(String[] args)?方法

public static void main(String[] args) {List<String> classes = SearchClassUtil.searchClass();for (String s: classes) {System.out.println(s);}
}
  • 功能:測試工具類,打印掃描到的類名。
  • 執行流程
    1. 調用searchClass()方法獲取類名列表。
    2. 遍歷列表并打印每個類名。

關鍵技術細節

1. 類路徑資源獲取

SearchClassUtil.class.getResource("/").getPath()
  • 工作原理
    • getResource("/")返回類路徑根目錄的URL對象。
    • .getPath()URL轉換為文件系統路徑。
  • 注意點
    • 路徑格式可能包含協議前綴(如file:/),但后續替換邏輯會處理此問題。
    • 在 JAR 包環境中,可能返回jar:file:/path/to/app.jar!/格式,此時該代碼會失效。

2. 路徑處理邏輯

file.getPath().replace(classpath.replace("/","\\").replaceFirst("\\\\",""),"")
  • 設計意圖
    • 移除類路徑前綴,保留相對路徑。
  • 存在問題
    • 跨平臺兼容性:混用/\\作為路徑分隔符,可能在非 Windows 系統上出錯。
    • 特殊路徑處理:若類路徑包含特殊字符(如空格),替換邏輯可能失效。

3. 靜態列表的線程安全

public static List<String> classPaths = new ArrayList<String>();

4.classpath.replace("/","\\").replaceFirst("\\\\","")?詳解

?這段代碼的核心目標是將類路徑字符串轉換為系統路徑格式,并移除可能存在的前導路徑分隔符,以便后續正確拼接和替換路徑。

?假設初始?classpath?值為:

String classpath = "/C:/workspace/project/target/classes/";
  1. 第一步:classpath.replace("/", "\\")

    • 將所有斜杠?/?替換為反斜杠?\
    • 結果:"\C:\workspace\project\target\classes\"
  2. 第二步:.replaceFirst("\\\\", "")

    • 使用正則表達式?\\\\(對應 Java 字符串中的?"\\",即正則中的?\)匹配第一個反斜杠
    • 將其替換為空字符串
    • 結果:"C:\workspace\project\target\classes\"

5. dopath遞歸

假設目錄結構如下:

classes/
└── tomcat/├── util/│   ├── StringUtil.class│   └── FileUtil.class└── SearchClassUtil.class

遞歸執行步驟:

  1. 初始調用doPath("classes/tomcat/", "classes/")

    • 處理目錄?tomcat/
    • 遞歸調用子項:util/?和?SearchClassUtil.class
  2. 處理?util/?目錄

    • 遞歸調用子項:StringUtil.class?和?FileUtil.class
  3. 處理?StringUtil.class

    • 路徑轉換:classes/tomcat/util/StringUtil.class?→?tomcat.util.StringUtil
    • 加入結果列表
  4. 處理?FileUtil.class

    • 路徑轉換:classes/tomcat/util/FileUtil.class?→?tomcat.util.FileUtil
    • 加入結果列表
  5. 返回處理?SearchClassUtil.class

    • 路徑轉換:classes/tomcat/SearchClassUtil.class?→?tomcat.SearchClassUtil
    • 加入結果列表

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

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

相關文章

云服務器的運用自如

云服務器的運用自如&#xff1a;從基礎到高階的實戰指南&#xff08;2025版&#xff09; 云服務器作為數字化轉型的核心工具&#xff0c;其靈活性和高效性已覆蓋從個人開發者到企業級應用的廣泛場景。以下是基于當前技術趨勢的云服務器深度運用策略&#xff0c;涵蓋核心應用、…

解密企業級大模型智能體Agentic AI 關鍵技術:MCP、A2A、Reasoning LLMs-docker MCP解析

解密企業級大模型智能體Agentic AI 關鍵技術&#xff1a;MCP、A2A、Reasoning LLMs-docker MCP解析 這里面有很重要的原因其中一個很其中一個原因是因為如果你使用docker的方式&#xff0c;你可以在虛擬環境下就類似于這個沙箱的這個機制可以進行隔離。這對于安全&#xff0c;…

快慢指針算法(Floyd 判圈算法)

快慢指針&#xff08;又稱龜兔賽跑算法&#xff09;是一種常用的鏈表操作技巧&#xff0c;通過兩個移動速度不同的指針遍歷鏈表&#xff0c;用于解決鏈表中環檢測、中點查找等問題。以下是其核心應用場景和實現方法&#xff1a; 1. 鏈表環檢測 問題描述&#xff1a; 判斷鏈表中…

獨立開發者利用AI工具快速制作產品MVP

在當今快速發展的科技時代&#xff0c;獨立開發者面臨著前所未有的機遇與挑戰。曾經需要花費數天甚至數周才能完成的產品MVP&#xff08;Minimum Viable Product&#xff0c;最小可行性產品&#xff09;&#xff0c;如今借助強大的AI工具&#xff0c;可以在短短1小時內實現。 …

Spark處理過程-轉換算子和行動算子

&#xff08;一&#xff09;RDD的處理過程 RDD經過一系列的“轉換”操作&#xff0c;每一次轉換都會產生不同的RDD&#xff0c;以供給下一次“轉換”操作使 用&#xff0c;直到最后一個RDD經過“行動”操作才會真正被計算處理。 1.延遲。RDD中所有的轉換都是延遲的&…

設置環境變量啟動jar報

1. 環境變量設置 set PATHC:\Program Files\java17\jdk-17.0.9\bin;%PATH%2. 啟動jar java -jar jar包名3. 記錄原因 PATH路徑前添加java執行文件路徑才會管用。添加后可以試試以下命令 直接輸入PATH 回車 PATH進行java版本測試 java -version

589. N叉樹的前序遍歷迭代法:null指針與棧的巧妙配合

一、題目描述 給定一個N叉樹的根節點&#xff0c;返回其節點值的前序遍歷結果。前序遍歷的定義是&#xff1a;先訪問根節點&#xff0c;再依次遍歷每個子節點&#xff08;從左到右&#xff09;。例如&#xff0c;對于如下N叉樹&#xff1a; 1/ | \3 2 4 / \ 5 6前序遍歷結果…

顯性知識的主要特征

有4個主要特征&#xff1a; 客觀存在性靜態存在性可共享性認知元能性

奧運數據可視化:探索數據講述奧運故事

在數據可視化的世界里&#xff0c;體育數據因其豐富的歷史和文化意義&#xff0c;常常成為最有吸引力的主題之一。今天我要分享一個令人著迷的奧運數據可視化項目&#xff0c;它巧妙地利用交互式圖表和動態動畫&#xff0c;展現了自1896年至今奧運會的發展歷程和各國奧運成就的…

Mysql存儲過程(附案例)

? 文章目錄 存儲過程概述1、基本語法2、變量①、系統變量②、用戶自定義變量③、局部變量 3、流程控制語句①、if語句②、參數③、case語句④、while語句⑤、repeat語句⑥、loop語句⑦、cursor游標⑧、handler 4、存儲函數 存儲過程概述 存儲過程是事先經過編譯并存儲在數據…

小波變換+注意力機制成為nature收割機

小波變換作為一種新興的信號分析工具&#xff0c;能夠高效地提取信號的局部特征&#xff0c;為復雜數據的處理提供了有力支持。然而&#xff0c;它在捕捉數據中最為關鍵的部分時仍存在局限性。為了彌補這一不足&#xff0c;我們引入了注意力機制&#xff0c;借助其能夠強化關注…

SQLMesh 增量模型從入門到精通:5步實現高效數據處理

本文深入解析 SQLMesh 中的增量時間范圍模型&#xff0c;介紹其核心原理、配置方法及高級特性。通過實際案例說明如何利用該模型提升數據加載效率&#xff0c;降低計算資源消耗&#xff0c;并提供配置示例與最佳實踐建議&#xff0c;幫助讀者在實際項目中有效應用這一強大功能。…

Android應用內存分析與優化 - 工具篇之Booster

序 在原理篇中&#xff0c;我們發現在App內存的分布中&#xff0c;Code是占大頭的部分&#xff0c;所以我們可以從App體積方面想辦法&#xff0c;通過減小App體積達到降低內存的目的&#xff0c;同時&#xff0c;根據權威的機構分析&#xff0c;體積與用戶下載和留存有很大的聯…

金屬加工液展|切削液展|2025上海金屬加工液展覽會

2025上海金屬加工液展覽會 時間&#xff1a;2025年12月2-4日 地點&#xff1a;上海新國際博覽中心 2025上海金屬加工液展規劃30000平方米展覽規模&#xff0c;預設展位1200個&#xff0c;將為國內外加工液產業提供一個集“展示、合作、交易、發展”于一體的綜合性平臺&#…

React學習———Redux 、 React Redux和react-persist

Redux Redux是一個流行的JavaScript狀態管理庫&#xff0c;通常用于React等前端框架結合使用。Redux 的設計思想是讓應用的狀態變得可預測、可追蹤、易于調試和測試。 Redux的核心l理念 單一數據源&#xff1a;整個應用的狀態被存儲在一個唯一的Store對象中&#xff0c;所有…

Python字符串常用方法詳解

文章目錄 Python字符串常用方法詳解一、字符串大小寫轉換方法(常用)1. 基礎大小寫轉換2. 案例&#xff1a;驗證碼檢查&#xff08;不區分大小寫&#xff09; 二、字符串查找與替換方法1. 查找相關方法2. 替換相關方法 三、字符串判斷方法1. 內容判斷方法 四、字符串分割與連接方…

MyBatis—動態 SQL

MyBatis—動態 SQL 一、動態 SQL 的核心作用 動態 SQL 主要解決以下問題&#xff1a; 靈活性&#xff1a;根據不同的輸入參數生成不同的 SQL 語句&#xff08;如條件查詢、批量操作&#xff09;。 可維護性&#xff1a;減少重復代碼&#xff0c;通過標簽化邏輯提高 SQL 可讀…

Python機器學習筆記(二十五、算法鏈與管道)

對于許多機器學習算法,特定數據表示非常重要。首先對數據進行縮放,然后手動合并特征,再利用無監督機器學習來學習特征。因此,大多數機器學習應用不僅需要應用單個算法,而且還需要將許多不同的處理步驟和機器學習模型鏈接在一起。Pipeline類可以用來簡化構建變換和模型鏈的…

YOLOv3深度解析:多尺度特征融合與實時檢測的里程碑

一、YOLOv3的誕生&#xff1a;繼承與突破的起點 YOLOv3作為YOLO系列的第三代算法&#xff0c;于2018年由Joseph Redmon等人提出。它在YOLOv2的基礎上&#xff0c;針對小目標檢測精度低、多類別標簽預測受限等問題進行了系統性改進。通過引入多尺度特征圖檢測、殘差網絡架構和獨…

已解決(親測有效!):安裝部署Docker Deskpot之后啟動出現Docker Engine Stopped!

文章目錄 已解決&#xff1a;安裝部署Docker Deskpot之后啟動出現Docker Engine Stopped&#xff01;個人環境介紹自己的解決問題思路&#xff08;詳細過程附截圖&#xff09;1.打開控制面板2.點擊程序和功能3.點擊啟動或關閉windows功能4.Hyper-V5.右鍵菜單欄的windows圖標點擊…