Java扫描classpath指定包路径下所有class
来源:互联网 发布:oracle数据库全库备份 编辑:程序博客网 时间:2024/06/05 20:20
在写框架时 经常需要扫描classpath指定包路径下带有某个Annotation的类,自己整理了一下 封装成一个工具类了,供大家参考。
源代码
ClassPathResourceScanner.java 如下:
package com.bytebeats.jupiter.ioc;import com.bytebeats.jupiter.util.ClassHelper;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.File;import java.io.IOException;import java.net.JarURLConnection;import java.net.URL;import java.net.URLDecoder;import java.util.*;import java.util.jar.JarEntry;import java.util.jar.JarFile;import java.util.regex.Pattern;/** * ${DESCRIPTION} * * @author Ricky Fung * @create 2016-12-11 16:02 */public class ClassPathCandidateComponentScanner { private final Logger logger = LoggerFactory.getLogger(getClass()); public static final String CLASS_SUFFIX = ".class"; private static final Pattern INNER_PATTERN = java.util.regex.Pattern.compile("\\$(\\d+).", java.util.regex.Pattern.CASE_INSENSITIVE); public Set<Class<?>> findCandidateComponents(String packageName) throws IOException { if (packageName.endsWith(".")) { packageName = packageName.substring(0, packageName.length()-1); } Map<String, String> classMap = new HashMap<>(32); String path = packageName.replace(".", "/"); Enumeration<URL> urls = findAllClassPathResources(path); while (urls!=null && urls.hasMoreElements()) { URL url = urls.nextElement(); String protocol = url.getProtocol(); if ("file".equals(protocol)) { String file = URLDecoder.decode(url.getFile(), "UTF-8"); File dir = new File(file); if(dir.isDirectory()){ parseClassFile(dir, packageName, classMap); }else { throw new IllegalArgumentException("file must be directory"); } } else if ("jar".equals(protocol)) { parseJarFile(url, classMap); } } Set<Class<?>> set = new HashSet<>(classMap.size()); for(String key : classMap.keySet()){ String className = classMap.get(key); try { set.add(ClassHelper.forName(className)); } catch (ClassNotFoundException e) { e.printStackTrace(); } } return set; } protected void parseClassFile(File dir, String packageName, Map<String, String> classMap){ if(dir.isDirectory()){ File[] files = dir.listFiles(); for (File file : files) { parseClassFile(file, packageName, classMap); } } else if(dir.getName().endsWith(CLASS_SUFFIX)) { String name = dir.getPath(); name = name.substring(name.indexOf("classes")+8).replace("\\", "."); System.out.println("file:"+dir+"\t class:"+name); addToClassMap(name, classMap); } } protected void parseJarFile(URL url, Map<String, String> classMap) throws IOException { JarFile jar = ((JarURLConnection) url.openConnection()).getJarFile(); Enumeration<JarEntry> entries = jar.entries(); while (entries.hasMoreElements()) { JarEntry entry = entries.nextElement(); if (entry.isDirectory()) { continue; } String name = entry.getName(); if(name.endsWith(CLASS_SUFFIX)){ addToClassMap(name.replace("/", "."), classMap); } } } private boolean addToClassMap(String name, Map<String, String> classMap){ if(INNER_PATTERN.matcher(name).find()){ //过滤掉匿名内部类 System.out.println("anonymous inner class:"+name); return false; } System.out.println("class:"+name); if(name.indexOf("$")>0){ //内部类 System.out.println("inner class:"+name); } if(!classMap.containsKey(name)){ classMap.put(name, name.substring(0, name.length()-6)); //去掉.class } return true; } protected Enumeration<URL> findAllClassPathResources(String path) throws IOException { if(path.startsWith("/")){ path = path.substring(1); } Enumeration<URL> urls = ClassHelper.getClassLoader().getResources(path); return urls; }}
使用方法
ClassPathCandidateComponentScanner scanner = new ClassPathCandidateComponentScanner();//要扫描的包名String packageName = "com.bytebeats";//获取该包下所有的类名称Set<Class<?>> set = scanner.findCandidateComponents(packageName);System.out.println(set.size());for (Class<?> cls : set){ System.out.println(cls.getName());}
这方面已经有一些不错的开源项目,例如:
reflections:https://github.com/ronmamo/reflections
Scannotation:http://scannotation.sourceforge.net/
0 0
- Java扫描classpath指定包路径下所有class
- Java 扫描指定包下的文件
- java 修改指定路径下所有文件名称
- Java 扫描包下所有类(包括jar包)
- Java如何扫描指定package下所有的类
- java读取指定package下的所有class
- java读取指定package下的所有class
- java读取指定package下的所有class
- java读取指定package下的所有class
- java读取指定package下的所有class
- java读取指定package下的所有class
- 扫描指定目录下所有图片文件
- Java删除指定路径下所有文件和文件夹
- android 扫描包下所有类
- Android 扫描指定路径里的所有文件
- Java获取classpath下的路径
- spring扫描类在指定包路径通过注解过滤
- java获取指定路径下的所有文件夹和文件名称路径
- Time
- 结构体的内存对齐
- Android开发之将json数据解析后填充到ListView
- J2EE 环境 Sturts2+Spring+MyBatis+bootstraps 整合案例(非maven项目)
- commons dbutils 的介绍与使用
- Java扫描classpath指定包路径下所有class
- 图的着色优化问题
- iOS开发 之 AFNetworking3.0使用详解
- 知识库--WebappClassLoader(47)
- Shell中的循环
- Mongo Java Driver示例
- tar.xz文件如何解压
- 桥本分数式--递归回溯
- socket通信的一些介绍