日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

java 如何掃描指定包下類(lèi)(包括jar中的java類(lèi))

瀏覽:157日期:2022-08-14 11:04:04

在很多的實(shí)際場(chǎng)景中,我們需要得到某個(gè)包名下面所有的類(lèi),

包括我們自己在src里寫(xiě)的java類(lèi)和一些第三方提供的jar包里的類(lèi),那么怎么來(lái)實(shí)現(xiàn)呢?

今天帶大家來(lái)完成這件事。

src下面的類(lèi)如何獲取:

首先,比較簡(jiǎn)單的是得到我們自己寫(xiě)的類(lèi),我們先來(lái)完成這個(gè),

項(xiàng)目的結(jié)構(gòu)圖如下:

java 如何掃描指定包下類(lèi)(包括jar中的java類(lèi))

我故意創(chuàng)建了這么個(gè)比較復(fù)雜的項(xiàng)目結(jié)構(gòu),現(xiàn)在我們就來(lái)獲取com.baibin包下所有的類(lèi),并且打印他們,代碼如下:

import org.junit.Test;import java.io.File;import java.util.ArrayList;import java.util.List;public class Main { List<String> classPaths = new ArrayList<String>(); @Test public void searchClass() throws ClassNotFoundException {//包名String basePack = 'com.baibin';//先把包名轉(zhuǎn)換為路徑,首先得到項(xiàng)目的classpathString classpath = Main.class.getResource('/').getPath();//然后把我們的包名basPach轉(zhuǎn)換為路徑名basePack = basePack.replace('.', File.separator);//然后把classpath和basePack合并String searchPath = classpath + basePack;doPath(new File(searchPath));//這個(gè)時(shí)候我們已經(jīng)得到了指定包下所有的類(lèi)的絕對(duì)路徑了。我們現(xiàn)在利用這些絕對(duì)路徑和java的反射機(jī)制得到他們的類(lèi)對(duì)象for (String s : classPaths) { //把 D:workcode20170401search-classtargetclassescombaibinsearchaA.class 這樣的絕對(duì)路徑轉(zhuǎn)換為全類(lèi)名com.baibin.search.a.A s = s.replace(classpath.replace('/','').replaceFirst('',''),'').replace('','.').replace('.class',''); Class cls = Class.forName(s); System.out.println(cls);} } /** * 該方法會(huì)得到所有的類(lèi),將類(lèi)的絕對(duì)路徑寫(xiě)入到classPaths中 * @param file */ private void doPath(File file) {if (file.isDirectory()) {//文件夾 //文件夾我們就遞歸 File[] files = file.listFiles(); for (File f1 : files) {doPath(f1); }} else {//標(biāo)準(zhǔn)文件 //標(biāo)準(zhǔn)文件我們就判斷是否是class文件 if (file.getName().endsWith('.class')) {//如果是class文件我們就放入我們的集合中。classPaths.add(file.getPath()); }} }}

效果如下:

java 如何掃描指定包下類(lèi)(包括jar中的java類(lèi))

總結(jié):這樣的src下面的都比較容易處理,也很容易想到,但是jar包下面的就沒(méi)這么簡(jiǎn)單了,

但是還是有辦法的。

jar中的類(lèi)如何獲取:

jar下的類(lèi)我們可以通過(guò)JarURLConnection類(lèi)來(lái)或者,代碼如下:

import org.junit.Test;import java.io.IOException;import java.net.JarURLConnection;import java.net.URL;import java.util.Enumeration;import java.util.jar.JarEntry;import java.util.jar.JarFile;public class JarMain { @Test public void searchClass() throws IOException, ClassNotFoundException {String basePack = 'org.junit';//通過(guò)當(dāng)前線(xiàn)程得到類(lèi)加載器從而得到URL的枚舉Enumeration<URL> urlEnumeration = Thread.currentThread().getContextClassLoader().getResources(basePack.replace('.', '/'));while (urlEnumeration.hasMoreElements()) { URL url = urlEnumeration.nextElement();//得到的結(jié)果大概是:jar:file:/C:/Users/ibm/.m2/repository/junit/junit/4.12/junit-4.12.jar!/org/junit String protocol = url.getProtocol();//大概是jar if ('jar'.equalsIgnoreCase(protocol)) {//轉(zhuǎn)換為JarURLConnectionJarURLConnection connection = (JarURLConnection) url.openConnection();if (connection != null) { JarFile jarFile = connection.getJarFile(); if (jarFile != null) {//得到該jar文件下面的類(lèi)實(shí)體Enumeration<JarEntry> jarEntryEnumeration = jarFile.entries();while (jarEntryEnumeration.hasMoreElements()) { /*entry的結(jié)果大概是這樣: org/ org/junit/ org/junit/rules/ org/junit/runners/*/ JarEntry entry = jarEntryEnumeration.nextElement(); String jarEntryName = entry.getName(); //這里我們需要過(guò)濾不是class文件和不在basePack包名下的類(lèi) if (jarEntryName.contains('.class') && jarEntryName.replaceAll('/','.').startsWith(basePack)) {String className = jarEntryName.substring(0, jarEntryName.lastIndexOf('.')).replace('/', '.');Class cls = Class.forName(className);System.out.println(cls); }} }} }} }}

通過(guò)這兩種方式我們就可以得到指定包名下面所有的類(lèi)了,這個(gè)還是挺有用的,

比如spring中經(jīng)常用來(lái)掃描指定包注解的實(shí)現(xiàn)等。

補(bǔ)充:獲取指定包名下的所有類(lèi)

寫(xiě)了一個(gè)工具類(lèi),用于獲取指定包名下的所有類(lèi),支持遞歸遍歷,支持注解過(guò)濾,可從 classpath (class 文件與 jar 包)中獲取。

import java.io.File;import java.io.FileFilter;import java.lang.annotation.Annotation;import java.net.JarURLConnection;import java.net.URL;import java.util.ArrayList;import java.util.Enumeration;import java.util.List;import java.util.jar.JarEntry;import java.util.jar.JarFile;public class ClassUtil { // 獲取指定包名下的所有類(lèi) public static List<Class<?>> getClassList(String packageName, boolean isRecursive) {List<Class<?>> classList = new ArrayList<Class<?>>();try { Enumeration<URL> urls = Thread.currentThread().getContextClassLoader().getResources(packageName.replaceAll('.', '/')); while (urls.hasMoreElements()) {URL url = urls.nextElement();if (url != null) { String protocol = url.getProtocol(); if (protocol.equals('file')) {String packagePath = url.getPath();addClass(classList, packagePath, packageName, isRecursive); } else if (protocol.equals('jar')) {JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection();JarFile jarFile = jarURLConnection.getJarFile();Enumeration<JarEntry> jarEntries = jarFile.entries();while (jarEntries.hasMoreElements()) { JarEntry jarEntry = jarEntries.nextElement(); String jarEntryName = jarEntry.getName(); if (jarEntryName.endsWith('.class')) {String className = jarEntryName.substring(0, jarEntryName.lastIndexOf('.')).replaceAll('/', '.');if (isRecursive || className.substring(0, className.lastIndexOf('.')).equals(packageName)) { classList.add(Class.forName(className));} }} }} }} catch (Exception e) { e.printStackTrace();}return classList; } // 獲取指定包名下的所有類(lèi)(可根據(jù)注解進(jìn)行過(guò)濾) public static List<Class<?>> getClassListByAnnotation(String packageName, Class<? extends Annotation> annotationClass) {List<Class<?>> classList = new ArrayList<Class<?>>();try { Enumeration<URL> urls = Thread.currentThread().getContextClassLoader().getResources(packageName.replaceAll('.', '/')); while (urls.hasMoreElements()) {URL url = urls.nextElement();if (url != null) { String protocol = url.getProtocol(); if (protocol.equals('file')) {String packagePath = url.getPath();addClassByAnnotation(classList, packagePath, packageName, annotationClass); } else if (protocol.equals('jar')) {JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection();JarFile jarFile = jarURLConnection.getJarFile();Enumeration<JarEntry> jarEntries = jarFile.entries();while (jarEntries.hasMoreElements()) { JarEntry jarEntry = jarEntries.nextElement(); String jarEntryName = jarEntry.getName(); if (jarEntryName.endsWith('.class')) {String className = jarEntryName.substring(0, jarEntryName.lastIndexOf('.')).replaceAll('/', '.');Class<?> cls = Class.forName(className);if (cls.isAnnotationPresent(annotationClass)) { classList.add(cls);} }} }} }} catch (Exception e) { e.printStackTrace();}return classList; } private static void addClass(List<Class<?>> classList, String packagePath, String packageName, boolean isRecursive) {try { File[] files = getClassFiles(packagePath); if (files != null) {for (File file : files) { String fileName = file.getName(); if (file.isFile()) {String className = getClassName(packageName, fileName);classList.add(Class.forName(className)); } else {if (isRecursive) { String subPackagePath = getSubPackagePath(packagePath, fileName); String subPackageName = getSubPackageName(packageName, fileName); addClass(classList, subPackagePath, subPackageName, isRecursive);} }} }} catch (Exception e) { e.printStackTrace();} } private static File[] getClassFiles(String packagePath) {return new File(packagePath).listFiles(new FileFilter() { @Override public boolean accept(File file) {return (file.isFile() && file.getName().endsWith('.class')) || file.isDirectory(); }}); } private static String getClassName(String packageName, String fileName) {String className = fileName.substring(0, fileName.lastIndexOf('.'));if (StringUtil.isNotEmpty(packageName)) { className = packageName + '.' + className;}return className; } private static String getSubPackagePath(String packagePath, String filePath) {String subPackagePath = filePath;if (StringUtil.isNotEmpty(packagePath)) { subPackagePath = packagePath + '/' + subPackagePath;}return subPackagePath; } private static String getSubPackageName(String packageName, String filePath) {String subPackageName = filePath;if (StringUtil.isNotEmpty(packageName)) { subPackageName = packageName + '.' + subPackageName;}return subPackageName; } private static void addClassByAnnotation(List<Class<?>> classList, String packagePath, String packageName, Class<? extends Annotation> annotationClass) {try { File[] files = getClassFiles(packagePath); if (files != null) {for (File file : files) { String fileName = file.getName(); if (file.isFile()) {String className = getClassName(packageName, fileName);Class<?> cls = Class.forName(className);if (cls.isAnnotationPresent(annotationClass)) { classList.add(cls);} } else {String subPackagePath = getSubPackagePath(packagePath, fileName);String subPackageName = getSubPackageName(packageName, fileName);addClassByAnnotation(classList, subPackagePath, subPackageName, annotationClass); }} }} catch (Exception e) { e.printStackTrace();} }}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久麻豆视频| 亚洲日产国产精品| 欧美精品三级在线| 91欧美精品| 少妇精品久久久一区二区三区| 美女少妇全过程你懂的久久| av一区在线| 欧美亚洲国产精品久久| 在线视频观看日韩| 午夜精品影院| 婷婷五月色综合香五月| 日韩va亚洲va欧美va久久| 日韩精品电影一区亚洲| 日韩不卡一二三区| 精品久久久网| av亚洲在线观看| 婷婷综合电影| 欧美激情另类| 99视频一区| 亚洲色图国产| 国际精品欧美精品| 国内激情久久| 日本综合精品一区| 精品国产一区二区三区噜噜噜| 久久人人97超碰国产公开结果| 国户精品久久久久久久久久久不卡| 欧美+亚洲+精品+三区| 亚洲精品乱码日韩| 福利一区二区| 亚洲欧美网站在线观看| 国产精品1区| 久久国产高清| 亚洲精品福利电影| 午夜视频一区二区在线观看| 国产日本亚洲| 精品欧美激情在线观看| 国产精品免费大片| 欧美午夜精品一区二区三区电影| 国产精品自在| 免费一级片91| 美女毛片一区二区三区四区| 国产精品对白久久久久粗| 99riav国产精品| 日韩一区二区三区免费| 91精品国产自产精品男人的天堂| 欧美 日韩 国产精品免费观看| 精品免费视频| 亚洲1区在线观看| 一区在线免费| 国产精品成久久久久| 国产精品一区二区三区四区在线观看 | 黄页网站一区| 韩国三级一区| 97视频热人人精品免费| 欧美偷窥清纯综合图区| 国产精品日韩| 亚洲欧美一区在线| 日产精品一区二区| 国产日韩欧美高清免费| 日本一区二区三区视频在线看 | 麻豆久久一区二区| 国产日韩视频在线| 日韩精品欧美精品| 性色一区二区| 日韩在线播放一区二区| 亚洲综合日本| 亚洲一区日韩在线| 国产亚洲福利| 国户精品久久久久久久久久久不卡| 欧美日韩精品免费观看视欧美高清免费大片 | 日韩中文字幕不卡| 一区二区精品| 国产欧美综合一区二区三区| 欧美激情综合| 久久精品国产亚洲夜色av网站| 欧美日韩一区二区综合| 亚洲欧洲日本mm| 亚洲精品护士| 美女视频黄 久久| av综合电影网站| 日韩视频二区| 日韩专区视频网站| 国产区精品区| 激情婷婷久久| 日本中文字幕一区二区视频| 欧美激情福利| 久久精品青草| 日韩欧美中文字幕一区二区三区| 久久一区欧美| 日韩午夜精品| 精品不卡一区| 奶水喷射视频一区| 国产精品白浆| 欧美另类专区| 美日韩一区二区三区| 国产一区日韩欧美| 欧美一级网站| 国产一区二区久久久久| 视频一区免费在线观看| 四虎成人av| 日韩成人精品一区二区三区| 久久久夜夜夜| 精品美女在线视频| 日本一区二区中文字幕| 成人一区而且| 欧美有码在线| 男人操女人的视频在线观看欧美| 吉吉日韩欧美| 国产欧美丝祙| 石原莉奈在线亚洲三区| 日韩一区自拍| 久久精品免视看国产成人| 亚洲国产成人精品女人| 岛国av在线播放| 国产精品香蕉| 噜噜噜躁狠狠躁狠狠精品视频 | 日韩成人亚洲| 国产一区二区三区天码| 91国内精品| 日韩福利视频一区| 色综合视频一区二区三区日韩 | 日韩欧美一区二区三区在线观看 | 亚洲精品麻豆| 一区二区不卡| 在线精品一区二区| 国产精品毛片在线看| 亚洲高清二区| 亚洲午夜av| 99亚洲精品| 天堂va在线高清一区| 亚洲综合不卡| 亚洲午夜免费| 青青草精品视频| 国产毛片精品| 国产精品白浆| 精品日韩视频| 蜜桃tv一区二区三区| 99riav1国产精品视频| 在线观看免费一区二区| 欧美综合另类| 蜜桃传媒麻豆第一区在线观看| 西西人体一区二区| 亚洲一二av| 国产一级成人av| 久久影视三级福利片| 国产精品777777在线播放| 色综合五月天| 久久精品毛片| 日韩伦理一区| 韩日一区二区| 日韩中文av| 香蕉视频成人在线观看| 免费看精品久久片| 国产精品一区二区精品视频观看| 国产精品草草| 久久亚洲国产| 在线观看亚洲精品福利片| 久久精品99国产精品日本| 国产精品大片| 99热精品在线观看| 少妇高潮一区二区三区99| 国产一区二区三区四区五区传媒 | 99久久精品国产亚洲精品| 91久久视频| 欧美aⅴ一区二区三区视频| 亚洲婷婷免费| 国产日本亚洲| 鲁大师影院一区二区三区| 国产欧美日韩一级| 亚洲a在线视频| 国产精品欧美大片| av不卡在线看| 日韩av二区| 美女国产精品| 色偷偷色偷偷色偷偷在线视频| 亚洲区国产区| 亚洲激情精品| 激情综合网站| 亚洲天堂av影院| 青草久久视频| 视频一区二区欧美| 国产二区精品| 日韩精品影视| 高清久久精品| 精品一区二区三区免费看| 日本一区二区中文字幕| 蜜桃视频免费观看一区| 在线一区免费| 天堂av在线| 国产精品伦一区二区| 日韩高清一区| 日韩在线网址| 中文字幕av亚洲精品一部二部| 亚洲小说欧美另类婷婷| 四虎成人av| 午夜免费一区| 欧美日韩国产探花| 免费欧美一区| 久久国产精品99国产| 99在线|亚洲一区二区|