日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringMVC 类扫描原理解析

發布時間:2025/7/14 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringMVC 类扫描原理解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

最近遇到關于SpringMVC包掃描的問題,借此機會想自己實現一個類似的包掃描機制,實際上原理很簡單,不過所需要的文件類是File和JarFile。

?

public class ClassScanner {public static void main(String[] args) {ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();try {URL resource = contextClassLoader.getResource("com/google/gson");URI uri = resource.toURI();if("file".equals(uri.getScheme())){File f = new File(uri.getPath());System.out.println(f);System.out.println(f.list());System.out.println(Arrays.asList(f.list()));}else if("jar".equals(uri.getScheme())){String path = resource.getFile();String[] pathParts = path.split("!");String jarFilePath = pathParts[0].substring(pathParts[0].indexOf("/"));System.out.println(jarFilePath);JarFile jarFile = new JarFile(jarFilePath);System.out.println(jarFile.entries());}} catch (Exception e) {e.printStackTrace();} } }

?

不過網上已經有了,這里轉載一下。

package com.itkt.mtravel.hotel.util; import java.io.File; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarFile; public class PackageUtil { public static void main(String[] args) throws Exception { String packageName = "com.wang.vo.request.hotel"; // List<String> classNames = getClassName(packageName); List<String> classNames = getClassName(packageName, false); if (classNames != null) { for (String className : classNames) { System.out.println(className); } } } /** * 獲取某包下(包括該包的所有子包)所有類 * @param packageName 包名 * @return 類的完整名稱 */ public static List<String> getClassName(String packageName) { return getClassName(packageName, true); } /** * 獲取某包下所有類 * @param packageName 包名 * @param childPackage 是否遍歷子包 * @return 類的完整名稱 */ public static List<String> getClassName(String packageName, boolean childPackage) { List<String> fileNames = null; ClassLoader loader = Thread.currentThread().getContextClassLoader(); String packagePath = packageName.replace(".", "/"); URL url = loader.getResource(packagePath); if (url != null) { String type = url.getProtocol(); if (type.equals("file")) { fileNames = getClassNameByFile(url.getPath(), null, childPackage); } else if (type.equals("jar")) { fileNames = getClassNameByJar(url.getPath(), childPackage); } } else { fileNames = getClassNameByJars(((URLClassLoader) loader).getURLs(), packagePath, childPackage); } return fileNames; } /** * 從項目文件獲取某包下所有類 * @param filePath 文件路徑 * @param className 類名集合 * @param childPackage 是否遍歷子包 * @return 類的完整名稱 */ private static List<String> getClassNameByFile(String filePath, List<String> className, boolean childPackage) { List<String> myClassName = new ArrayList<String>(); File file = new File(filePath); File[] childFiles = file.listFiles(); for (File childFile : childFiles) { if (childFile.isDirectory()) { if (childPackage) { myClassName.addAll(getClassNameByFile(childFile.getPath(), myClassName, childPackage)); } } else { String childFilePath = childFile.getPath(); if (childFilePath.endsWith(".class")) { childFilePath = childFilePath.substring(childFilePath.indexOf("\\classes") + 9, childFilePath.lastIndexOf(".")); childFilePath = childFilePath.replace("\\", "."); myClassName.add(childFilePath); } } } return myClassName; } /** * 從jar獲取某包下所有類 * @param jarPath jar文件路徑 * @param childPackage 是否遍歷子包 * @return 類的完整名稱 */ private static List<String> getClassNameByJar(String jarPath, boolean childPackage) { List<String> myClassName = new ArrayList<String>(); String[] jarInfo = jarPath.split("!"); String jarFilePath = jarInfo[0].substring(jarInfo[0].indexOf("/")); String packagePath = jarInfo[1].substring(1); try { JarFile jarFile = new JarFile(jarFilePath); Enumeration<JarEntry> entrys = jarFile.entries(); while (entrys.hasMoreElements()) { JarEntry jarEntry = entrys.nextElement(); String entryName = jarEntry.getName(); if (entryName.endsWith(".class")) { if (childPackage) { if (entryName.startsWith(packagePath)) { entryName = entryName.replace("/", ".").substring(0, entryName.lastIndexOf(".")); myClassName.add(entryName); } } else { int index = entryName.lastIndexOf("/"); String myPackagePath; if (index != -1) { myPackagePath = entryName.substring(0, index); } else { myPackagePath = entryName; } if (myPackagePath.equals(packagePath)) { entryName = entryName.replace("/", ".").substring(0, entryName.lastIndexOf(".")); myClassName.add(entryName); } } } } } catch (Exception e) { e.printStackTrace(); } return myClassName; } /** * 從所有jar中搜索該包,并獲取該包下所有類 * @param urls URL集合 * @param packagePath 包路徑 * @param childPackage 是否遍歷子包 * @return 類的完整名稱 */ private static List<String> getClassNameByJars(URL[] urls, String packagePath, boolean childPackage) { List<String> myClassName = new ArrayList<String>(); if (urls != null) { for (int i = 0; i < urls.length; i++) { URL url = urls[i]; String urlPath = url.getPath(); // 不必搜索classes文件夾 if (urlPath.endsWith("classes/")) { continue; } String jarPath = urlPath + "!/" + packagePath; myClassName.addAll(getClassNameByJar(jarPath, childPackage)); } } return myClassName; } }

由于我們并不確定jar包生成時采用的哪種方式,如果采用默認生成jar包的方式,那我們通過Thread.currentThread().getContextClassLoader().getResource()是獲取不到的,因此我增加了從所有jar包中搜索提供的包域名,這樣功能就完善了很多。

?

?

轉載于:https://my.oschina.net/ososchina/blog/1548986

總結

以上是生活随笔為你收集整理的SpringMVC 类扫描原理解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本国产精品 | 日韩久草 | 91精品导航| 免费成人深夜夜国外 | 久久国产精品系列 | 免费网站在线观看视频 | 久久亚洲精品小早川怜子 | 日韩精品在线观看网站 | youjizz中国少妇 | 亚洲成人一区二区三区 | javxxx| 欧美久久久久久久久久久久久久 | 国产经典av| 拍真实国产伦偷精品 | 国产大片b站| 91麻豆国产精品 | 伊人爱爱网 | 黄色在线视频网站 | 日本视频不卡 | 黄瓜视频在线播放 | 成人片在线看 | 久久精品一区二区在线观看 | 一女三黑人理论片在线 | 日本三级影院 | 国产日韩成人内射视频 | 国产一区二区三区在线视频 | 丁香花完整视频在线观看 | 国产精品福利一区二区 | 亚洲欧美成人网 | 国产精品一区二区三 | 伊人ab| 污视频在线网站 | 日韩国产综合 | a v视频在线观看 | 欧美第一页草草影院 | 九草视频在线 | 国产97视频 | 美女午夜激情 | 麻豆免费观看网站 | 91精彩视频在线观看 | 日本wwwxxx | 国产精品毛片久久久久久 | 美女少妇一区二区 | 99久久久无码国产精品6 | 亚洲最大av在线 | 国产午夜福利一区二区 | 国产一区亚洲 | av毛片网站| 欧美日韩一区二区区别是什么 | 欧美少妇激情 | 精东传媒在线观看 | 国产最新自拍视频 | 自拍偷拍999| 欧美高清在线一区 | 国产精品久久久久久久久晋中 | 99精品免费 | 两性午夜免费视频 | 日本一区二区在线看 | 污污内射在线观看一区二区少妇 | 在线观看黄色的网站 | 亚洲一区二区三区电影 | 成人在线观看免费高清 | 夫妻精品 | 男女深夜福利 | 久久久久久午夜 | 激情免费网站 | 97精品人人妻人人 | 五月激情啪啪 | 国内性爱视频 | 国产欧美综合一区二区三区 | 日本aa视频| 久久精品视频一区 | 国家队动漫免费观看在线观看晨光 | 国产在线观 | 日韩无| 欧美又粗又大xxxxbbbb疯狂 | 看av在线| 久热这里只有精品在线 | 深夜福利91| 桃谷绘里香番号 | 中文字幕第一页久久 | 自拍视频网址 | 欧美日韩国产免费一区二区三区 | 夜夜摸视频网 | 国产又粗又猛又黄又爽无遮挡 | 91精产国品一二三 | 欧美精品做受xxx性少妇 | 国产色99| 日韩a在线播放 | 亚洲涩网| 久久人妖| 人人插人人搞 | 最好看的中文字幕国语电影mv | 亚洲专区一区二区三区 | 欧美日韩在线视频观看 | 青娱乐国产在线视频 | 亚洲欧美日本一区二区三区 | 波多野结衣电影在线播放 | 涩涩涩综合 |