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

您的位置:首頁技術文章
文章詳情頁

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

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

在很多的實際場景中,我們需要得到某個包名下面所有的類,

包括我們自己在src里寫的java類和一些第三方提供的jar包里的類,那么怎么來實現呢?

今天帶大家來完成這件事。

src下面的類如何獲取:

首先,比較簡單的是得到我們自己寫的類,我們先來完成這個,

項目的結構圖如下:

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

我故意創建了這么個比較復雜的項目結構,現在我們就來獲取com.baibin包下所有的類,并且打印他們,代碼如下:

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';//先把包名轉換為路徑,首先得到項目的classpathString classpath = Main.class.getResource('/').getPath();//然后把我們的包名basPach轉換為路徑名basePack = basePack.replace('.', File.separator);//然后把classpath和basePack合并String searchPath = classpath + basePack;doPath(new File(searchPath));//這個時候我們已經得到了指定包下所有的類的絕對路徑了。我們現在利用這些絕對路徑和java的反射機制得到他們的類對象for (String s : classPaths) { //把 D:workcode20170401search-classtargetclassescombaibinsearchaA.class 這樣的絕對路徑轉換為全類名com.baibin.search.a.A s = s.replace(classpath.replace('/','').replaceFirst('',''),'').replace('','.').replace('.class',''); Class cls = Class.forName(s); System.out.println(cls);} } /** * 該方法會得到所有的類,將類的絕對路徑寫入到classPaths中 * @param file */ private void doPath(File file) {if (file.isDirectory()) {//文件夾 //文件夾我們就遞歸 File[] files = file.listFiles(); for (File f1 : files) {doPath(f1); }} else {//標準文件 //標準文件我們就判斷是否是class文件 if (file.getName().endsWith('.class')) {//如果是class文件我們就放入我們的集合中。classPaths.add(file.getPath()); }} }}

效果如下:

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

總結:這樣的src下面的都比較容易處理,也很容易想到,但是jar包下面的就沒這么簡單了,

但是還是有辦法的。

jar中的類如何獲取:

jar下的類我們可以通過JarURLConnection類來或者,代碼如下:

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';//通過當前線程得到類加載器從而得到URL的枚舉Enumeration<URL> urlEnumeration = Thread.currentThread().getContextClassLoader().getResources(basePack.replace('.', '/'));while (urlEnumeration.hasMoreElements()) { URL url = urlEnumeration.nextElement();//得到的結果大概是: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)) {//轉換為JarURLConnectionJarURLConnection connection = (JarURLConnection) url.openConnection();if (connection != null) { JarFile jarFile = connection.getJarFile(); if (jarFile != null) {//得到該jar文件下面的類實體Enumeration<JarEntry> jarEntryEnumeration = jarFile.entries();while (jarEntryEnumeration.hasMoreElements()) { /*entry的結果大概是這樣: org/ org/junit/ org/junit/rules/ org/junit/runners/*/ JarEntry entry = jarEntryEnumeration.nextElement(); String jarEntryName = entry.getName(); //這里我們需要過濾不是class文件和不在basePack包名下的類 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); }} }} }} }}

通過這兩種方式我們就可以得到指定包名下面所有的類了,這個還是挺有用的,

比如spring中經常用來掃描指定包注解的實現等。

補充:獲取指定包名下的所有類

寫了一個工具類,用于獲取指定包名下的所有類,支持遞歸遍歷,支持注解過濾,可從 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 { // 獲取指定包名下的所有類 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; } // 獲取指定包名下的所有類(可根據注解進行過濾) 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();} }}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲激情久久| 欧美日韩黄网站| 日本不卡一二三区黄网| 影音先锋久久| 亚洲综合电影一区二区三区| 日韩精品免费一区二区在线观看| 丁香婷婷久久| 日韩欧美一区二区三区免费看| 欧美国产视频| 免费日韩一区二区三区| 久久国产精品色av免费看| 日韩av一级片| 麻豆91在线播放| 国产精品麻豆成人av电影艾秋| 久久精品99国产精品日本| 日本精品一区二区三区在线观看视频| 亚洲毛片视频| 奇米色欧美一区二区三区| 国产欧美日韩在线一区二区| 久久精品97| 91日韩欧美| 蜜臀va亚洲va欧美va天堂| 99热精品在线| 老司机精品视频网| 欧美成人久久| 91成人精品在线| 中国字幕a在线看韩国电影| 欧美日韩免费观看一区=区三区 | 精品不卡一区| 水蜜桃精品av一区二区| 欧美成人午夜| 老司机免费视频一区二区| 精品少妇一区| 狠狠爱www人成狠狠爱综合网| 日本不卡视频一二三区| 女同性一区二区三区人了人一| 久久久久久免费视频| 欧美日韩在线二区| 国产精品视频一区二区三区四蜜臂 | 亚洲免费影院| 97精品97| 国产精品手机在线播放| 男人天堂欧美日韩| 日韩国产欧美一区二区| 久久精品99国产精品日本| 色偷偷偷在线视频播放| 日韩国产一区| 国产va免费精品观看精品视频| 亚洲一区av| 视频一区二区中文字幕| 久久蜜桃资源一区二区老牛| 精品美女在线视频| 国产精品扒开腿做爽爽爽软件| 亚洲激情精品| 午夜精品婷婷| 亚洲视频www| 婷婷丁香综合| 日韩一区欧美| 亚洲高清久久| 亚洲国产专区校园欧美| 精品国产免费人成网站| 国产精品第一| 国产日韩视频在线| 日本久久一区| 日韩精品一区二区三区中文| 国产一区视频在线观看免费| 精品视频高潮| 久久av偷拍| 日韩精品一区二区三区免费视频 | 精品色999| 久久精品国产网站| 激情不卡一区二区三区视频在线| 日韩极品在线观看| 在线午夜精品| 日韩在线卡一卡二| 国产在线成人| 国产二区精品| 91久久久久| 免费不卡在线观看| 九九久久电影| 久久不卡日韩美女| 国产精品一页| 91成人精品观看| 国产精品日韩精品在线播放| 欧美日一区二区三区在线观看国产免| 亚欧成人精品| 国产免费av国片精品草莓男男| 久久国产精品久久w女人spa| 视频一区免费在线观看| 丝瓜av网站精品一区二区| 亚洲毛片在线免费| 国产乱子精品一区二区在线观看| 亚洲九九精品| 久久不见久久见中文字幕免费| 国产欧美一区二区色老头| 红杏一区二区三区| 国产午夜久久av| 国产精品久久乐| 国产精品v一区二区三区| 国产乱人伦精品一区| 国产成人精品一区二区三区视频 | 欧美日韩精品一区二区三区视频 | 麻豆精品视频在线观看免费| 色偷偷色偷偷色偷偷在线视频| 红桃视频国产一区| 国产传媒在线| 亚洲我射av| 成人片免费看| 亚洲精品乱码久久久久久蜜桃麻豆 | 欧美日韩亚洲一区| 在线天堂中文资源最新版| 鲁大师成人一区二区三区 | 免费看日韩精品| 久久久久伊人| 免费看精品久久片| 蜜桃av在线播放| 国产精品一区二区三区四区在线观看| 久久精品青草| 久久亚州av| 青青青国产精品| 激情欧美丁香| 欧美男人天堂| 国产日韩亚洲| 不卡在线一区| 美女精品一区二区| 日本久久二区| 亚洲欧美一级| 国产精品色网| 黄色成人精品网站| 欧美影院三区| 欧美日韩精品一区二区视频| 成人在线观看免费视频| 国产精品一卡| 国产精品久久久久久模特| 亚洲啊v在线免费视频| 久久都是精品| 中文一区一区三区免费在线观 | 日韩精品亚洲专区| 视频国产精品| 日韩欧美中文字幕在线视频| av不卡免费看| 视频一区国产视频| 亚洲免费高清| 亚洲日本在线观看视频| 亚洲资源在线| 日韩高清国产一区在线| 日本高清久久| 国产精品久久久久av蜜臀| 国产日韩亚洲| 国产精品久久久久久久免费观看| 久久精品凹凸全集| 精品国产中文字幕第一页| 国产成人精品一区二区三区在线| 国产一区二区三区四区二区| 国产精品原创| 亚洲自拍另类| 国产精选久久| 激情国产在线| 亚洲一区二区三区久久久| 国产欧美69| 99国产精品免费视频观看| 国产精品日韩久久久| 视频精品一区| a国产在线视频| 蜜臀国产一区二区三区在线播放 | 久久夜夜操妹子| 中文一区在线| 美女精品久久| 日韩免费小视频| 爽好多水快深点欧美视频| 欧美日韩一区二区国产| 久久青草久久| 日韩精品久久理论片| 国产伊人久久| 中文字幕中文字幕精品| 精品亚洲成人| 午夜精品网站| 高清精品久久| 日韩不卡一区二区| 欧美一区三区| 精品丝袜久久| 婷婷综合一区| 黄色在线一区| 日韩大片在线| 久久精品一本| 蜜桃精品视频| 日韩av网站免费在线| 好看不卡的中文字幕| 日韩av在线中文字幕| 日韩国产欧美视频| 妖精视频成人观看www| 久久久久国产| 日韩av二区在线播放| 黄色欧美日韩| 激情欧美日韩一区| 久久久久91| 伊人久久高清| 午夜精品久久久久久久久久蜜桃| 国产精品99久久免费观看| 日韩精品一级|