1. 程式人生 > >如何裸寫或利用Spring掃描出指定包下的所有類名

如何裸寫或利用Spring掃描出指定包下的所有類名

在很多Java框架中都有元件掃描功能,即給出一個註解,框架能夠把所有標註了此註解的類找出來。這種操作的本質是給出一個名包,能獲取到此包下的所有類名,然後再通過反射判斷是否加了指定的註解。無論是什麼框架,包括Spring, 完成這個功能底層都是用的ClassLoader.getResources()ClassLoader.getSystemResources()方法實現的,即先找出指定classpath下的"資源",可能是檔案也可能是jar包,然後通過檔案I/O讀取jar, 把每一個.class檔名全部列出即可。如果我們要自己手寫這樣的功能的話就必須參照這個思路去實現,但是邏輯比較複雜,主要是很多細節問題需要注意。這裡有一個我自己實現的PkgScanner

可供參考,github: https://github.com/wanghongfei/pkg-scanner

當然,多數時候我們並不想自己重複造輪子。Spring就有現成的類可以讓我們直接使用, 它們分別是ResourcePatternResolverCachingMetadataReaderFactory,使用方法如下:

public class ScanTest extends BaseTestClass implements ResourceLoaderAware {
    /**
     * Spring容器注入
     */
    private ResourceLoader resourceLoader;

    @Test
    public void test() throws IOException {

        ResourcePatternResolver resolver = ResourcePatternUtils.getResourcePatternResolver(resourceLoader);
        MetadataReaderFactory metaReader = new CachingMetadataReaderFactory(resourceLoader);
        Resource[] resources = resolver.getResources("classpath*:your/package/name/**/*.class");

        for (Resource r : resources) {
            MetadataReader reader = metaReader.getMetadataReader(r);
            System.out.println(reader.getClassMetadata().getClassName());
        }

    }

    @Override
    public void setResourceLoader(ResourceLoader resourceLoader) {
        this.resourceLoader = resourceLoader;
    }
}

在我的專案裡,這個單測的輸出是:
output
可見已經完全滿足了要求。

如果去深究原始碼實現,最終你會在PathMatchingResourcePatternResolver類的doFindAllClassPathResources()方法中找到答案:
code
即,本質還是掃描jar包,讀取jar包。

其實這個功能最好直接整合到JDK的類庫中,這樣大家就不必繞這麼大圈子來實現這個看似簡單但邏輯又非常複雜的功能了。

相關推薦

如何利用Spring掃描指定所有

在很多Java框架中都有元件掃描功能,即給出一個註解,框架能夠把所有標註了此註解的類找出來。這種操作的本質是給出一個名包,能獲取到此包下的所有類名,然後再通過反射判斷是否加了指定的註解。無論是什麼框架,包括Spring, 完成這個功能底層都是用的ClassLoa

java 遍歷指定所有,返回完整。工具,可以直接拷入使用

1、說明:       此類為本人開發的工具類,具體應用在什麼地方呢。本人在實際專案中,許可權管理這一塊有所應用,應該是許可權這一塊有所需求而開發的。 應用場景說明:許可權資源自動化生產時,使用者點選介面的一鍵生成資源時,介面中就會遍歷指定controller包下所有

獲取指定所有自定義註解並提取註解資訊

Reflections 通過掃描 classpath,索引元資料,允許在執行時查詢這些元資料,也可以儲存收集專案中多個模組的元資料資訊。 使用Reflections快速掃描指定包下自定義的Controller和RequestMapping兩個註解,先去掃描加了@Cont

史上最完整掃描所有(含Jar掃描,maven子專案掃描

要掃描包下的所有類,分類路徑下掃描和jar包掃描兩種,其中jar包掃描又分專案中引入的三方jar包,同級maven的多個子專案jar相互引用,還有jdk jar包(這裡不考慮,一般沒哪個專案會掃描jdk jar包裡的類). 我先宣告一個介面,用於應對不同型別的class

Java 掃描所有(包括jar

package com.MyUtils.file;import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.net.JarURLConnection; i

php 利用scandir() 函數 掃描制定目錄所有文件

for log scan echo 壓縮文件 引號 sta 舉例 logs //遍歷子文件夾和文件夾的內容 並且計算出文件的多少   //一個demo 引號替換下function scan($dir){ static $i=0; static $d=0;

指定數字的所有質因數,比如:90=2*3*3*5。

while style turn emp port pri sqrt return opera 1 from math import sqrt 2 from functools import reduce 3 from operator import mul 4

掃描指定目錄所有圖片文件

沒有 extern wpa gets 當前 indexof path resolv cti String myparent=newPath.substring(0, newPath.lastIndexOf("/")).substring(newPath.substrin

JAVA——求指定範圍內所有的質數

求出指定範圍內所有的質數 1.要求 在視窗輸出指定範圍內所有的質數,並對所有輸出的質數個數進行計數。 2.質數 在所有比1大的整數中,除了1和它本身以外,不再有別的因數,這種整數叫做質數或素數。還可以說成質數只有1和它本身兩個約數。 3.原理 具體做法是:先

Java掃描classpath指定路徑所有class

在寫框架時 經常需要掃描classpath指定包路徑下帶有某個Annotation的類,自己整理了一下 封裝成一個工具類了,供大家參考。 原始碼ClassPathResourceScanner.java 如下: package com.bytebeats.jupiter.ioc; import com.

Java——打印指定目錄中所有的檔案 ,包括子資料夾中的所有檔案

import java.io.File; // 打印出指定目錄中所有的檔案 ,包括子資料夾中的所有檔案 //遍歷檔案下所有的檔案 public class FileDemo { public static void main(String[] args) { File f

利用反射打印 Jar所有和方法

public class Test { public static void getJarClassNameAndMethod(String jarFile) throws Exception {         try {         File f=new File

如何掃描android手機中所有的視訊檔案

public static List<VideoInfo> allVideoList = null;// 視訊資訊集合 allVideoList = new ArrayList<VideoInfo>(); getVideoFile(allVideoL

Java 掃描指定的檔案

第一種方法:利用google的guava掃描指定的包 StringBuffer value = new StringBuffer(); String packageName = "com.business.service.impl"; ClassPath classpat

掃描指定目錄所有圖片檔案

<span style="font-size:18px;"> String myparent=newPath.substring(0, newPath.lastIndexOf("/")).substring(newPath.substrin

抓取指定路徑所有文檔名

mds 所有 -- 2.6 div ast txt rom char --方法1: EXEC xp_dirtree ‘\\172.6.6.6\D$\TEXT\‘,1,1 --方法2: CREATE TABLE #TXT_Name (NAME VARCHAR( 2000)

加載指定所有

open current 測試 slf4j initial out sources resource rfi package util; import java.io.File; import java.io.FileFilter; import java.io.IOE

python——查詢linux指定目錄所有的空目錄

pac 方法 6.5 AC 查詢 argv sys.argv 目錄名 env 1 #!/usr/bin/env python3 2 # -*- coding: utf-8 -*- 3 #*******查詢指定目錄中的空目錄********* 4 #執行方法:pyt

pytohn 利用cv2批量改變資料夾所有影象的大小

import cv2 import os # 修改之後的圖片大小 size_ = (1920, 1080) # directory為檔案所在的目錄, # 將會將修改後的圖片儲存在 directory下resized_image資料夾中 directory = r'C:\Users\

Jquery 獲取指定 table 所有 type 'text' 的 input

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!