java 遍历类路径
生活随笔
收集整理的這篇文章主要介紹了
java 遍历类路径
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
// public class ClassPathScanner {private static final String PROTOCOL_FILE = "file";private static final String PROTOCOL_JAR = "jar";private static final String PREFIX_FILE = "file:";private static final String JAR_URL_SEPERATOR = "!/";private static final String CLASS_FILE = ".class";private final String packageName;private final ClassFilter filter;public ClassPathScanner(String packageName) {this(packageName, null);}public ClassPathScanner(String packageName, ClassFilter filter) {this.packageName = packageName;this.filter = filter;}public List<Class<?>> scan() {List<Class<?>> list = new ArrayList<Class<?>>();Enumeration<URL> en = null;try {en = getClass().getClassLoader().getResources(dotToPath(packageName));} catch (IOException e) {e.printStackTrace();}while (en.hasMoreElements()) {URL url = en.nextElement();if (PROTOCOL_FILE.equals(url.getProtocol())) {File root = new File(url.getFile());findInDirectory(list, root, root, packageName);} else if (PROTOCOL_JAR.equals(url.getProtocol())) {findInJar(list, getJarFile(url), packageName);}}return list;}public File getJarFile(URL url) {String file = url.getFile();if (file.startsWith(PREFIX_FILE))file = file.substring(PREFIX_FILE.length());int end = file.indexOf(JAR_URL_SEPERATOR);if (end != (-1))file = file.substring(0, end);return new File(file);}void findInJar(List<Class<?>> results, File file, String packageName) {JarFile jarFile = null;String packagePath = dotToPath(packageName) + "/";try {jarFile = new JarFile(file);Enumeration<JarEntry> en = jarFile.entries();while (en.hasMoreElements()) {JarEntry je = en.nextElement();String name = je.getName();if (name.startsWith(packagePath) && name.endsWith(CLASS_FILE)) {String className = name.substring(0, name.length() - CLASS_FILE.length());add(results, pathToDot(className));}}} catch (IOException e) {e.printStackTrace();} finally {if (jarFile != null) {try {jarFile.close();} catch (IOException e) {}}}}void findInDirectory(List<Class<?>> results, File rootDir, File dir, String packageName) {File[] files = dir.listFiles();String rootPath = rootDir.getPath();for (File file : files) {if (file.isFile()) {String classFileName = file.getPath();if (classFileName.endsWith(CLASS_FILE)) {String className = classFileName.substring(rootPath.length() - packageName.length(),classFileName.length() - CLASS_FILE.length());add(results, pathToDot(className));}} else if (file.isDirectory()) {findInDirectory(results, rootDir, file, packageName);}}}void add(List<Class<?>> results, String className) {Class<?> clazz = null;try {clazz = Class.forName(className);} catch (ClassNotFoundException e) {return;}if (filter == null || filter.accept(clazz))results.add(clazz);}String dotToPath(String s) {return s.replace('.', '/');}String pathToDot(String s) {return s.replace('/', '.').replace('\\', '.');} }// public interface ClassFilter {boolean accept(Class<?> clazz); }// public static void main(String[] args) {List<Class<?>> list = new ClassPathScanner("org.springframework.core.io",new ClassFilter() {public boolean accept(Class<?> clazz) {// 返回接口類,可自定義其他條件return clazz.isInterface(); }}).scan();for (Class<?> clazz : list) {System.out.println(clazz);} }轉載于:https://my.oschina.net/kind790/blog/1622383
總結
以上是生活随笔為你收集整理的java 遍历类路径的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ STL set(集合)
- 下一篇: BLE CC2541 串口BootLo