@Slf4j public class ClassUtil { public static final String FILE_PROTOCOL = "file"; /** * * @param packageName */ public static Set<Class<?>> extractPackageClass(String packageName){ //1.获取类加载器 ClassLoader classLoader = getClassLoader(); //2.依据类加载器获取到加载的资源 URL url = classLoader.getResource(packageName.replace(".","/")); if (url == null){ log.warn("unable to retieve anything from package:" + packageName); return null; } //3.更具不同的资源类型,采取不同的获取方式 Set<Class<?>> classSet = null; //过滤文件类型的资源 if (url.getProtocol().equalsIgnoreCase(FILE_PROTOCOL)){ classSet = new HashSet<Class<?>>(); File packageDirectory = new File(url.getPath()); extractClassFile(classSet,packageDirectory,packageName); } //TODO 此处可以加入其他类型的资源处理 return classSet; } /** * 递归获取目标package里面的所有class文件(包括子package里的class文件) * @param emptyClassSet 装载目标类的集合 * @param fileSource 文件或者目录 * @param packageName 包名 */ private static void extractClassFile(Set<Class<?>> emptyClassSet, File fileSource, String packageName) { if (!fileSource.isDirectory()){ return; } //如果是一个文件夹,则调用listfile方法获取文件夹下的文件和文件夹 File[] files = fileSource.listFiles(new FileFilter() { @Override public boolean accept(File file) { if (file.isDirectory()){ return true; }else { //获取文件的绝对值路径 String absolutePath = file.getAbsolutePath(); if (absolutePath.endsWith(".class")){ //若是class文件,封装成类实例,加载到emptyClassSet里面 addToClassSet(absolutePath); } } return false; } //根据class文件的绝对值路径,获取并生成class路径,并加入classSet中 private void addToClassSet(String absolutePath) { //1.从class文件的绝对值路径里提取出包含package的类名 //如F:springsimpleframeworksrcmainjavacomdevonentitydtoMainPageInfoDTO.java //需要转换成com.devon.entity.dto.MainPageInfoDTO absolutePath = absolutePath.replace(File.separator, "."); String className = absolutePath.substring(absolutePath.indexOf(packageName)); className = className.substring(0,className.lastIndexOf(".")); //2.通过反射机制获取对应的Class对象并加入到classSet里面 Class<?> targetClass = loadClass(className); emptyClassSet.add(targetClass); } }); if (files != null){ for (File f : files) { extractClassFile(emptyClassSet,f,packageName); } } } /** * 获取Class对象 * @param className * @return */ public static Class<?> loadClass(String className){ try { return Class.forName(className); } catch (ClassNotFoundException e) { log.error("load class error:",e); throw new RuntimeException(e); } } /** * 类加载器获取项目资源 * @return */ public static ClassLoader getClassLoader(){ return Thread.currentThread().getContextClassLoader(); } public static void main(String[] args) { extractPackageClass("com.devon.entity"); } }