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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

获取指定包名下的所有类

發(fā)布時(shí)間:2024/4/13 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 获取指定包名下的所有类 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

?

總結(jié)

以上是生活随笔為你收集整理的获取指定包名下的所有类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。