通过扫描包路径获取包内class

public static Set<Class<?>> getClasses(ClassLoader classLoader, String pack) {
        Set<Class<?>> classes = new LinkedHashSet<Class<?>>();
        boolean recursive = true;
        String packageName = pack;
        // 包路径分隔符 . 换为 /
        String packageDirName = packageName.replace(‘.‘, ‘/‘);
        try {
            Enumeration<URL> dirs;
            if (classLoader == null) {
                dirs = Thread.currentThread().getContextClassLoader()
                        .getResources(packageDirName);
            } else {
                dirs = classLoader.getResources(packageDirName);
            }
            while (dirs.hasMoreElements()) {
                URL url = (URL) dirs.nextElement();
                String protocol = url.getProtocol();
                if ("file".equals(protocol)) {
                    String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
                    findAndAddClassesInPackageByFile(packageName, filePath,recursive, classes);
                } else if ("jar".equals(protocol)) {
                    try {
                        JarFile jar = ((JarURLConnection) url.openConnection())
                                .getJarFile();
                        Enumeration<JarEntry> entries = jar.entries();
                        while (entries.hasMoreElements()) {
                            JarEntry entry = (JarEntry) entries.nextElement();
                            String name = entry.getName();
                            if (name.charAt(0) == ‘/‘) {
                                name = name.substring(1);
                            }
                            if (name.startsWith(packageDirName)) {
                                int idx = name.lastIndexOf("/");
                                if (idx != -1) {
                                    packageName = name.substring(0, idx).replace(‘/‘, ‘.‘);
                                }
                                if (((idx != -1) || (recursive)) && (name.endsWith(".class")) && (!entry.isDirectory())) {
                                    String className = name.substring(packageName.length() + 1,name.length() - 6);
                                    try {
                                        classes.add(Thread.currentThread().getContextClassLoader().loadClass(
                                                        packageName + "." + className));
                                    } catch (Exception ex) {
                                        log.error(ex.getMessage(), ex);
                                    }
                                }
                            }
                        }
                    } catch (Exception ex) {
                        log.error(ex.getMessage(), ex);
                    }
                }
            }
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }
        return classes;
    }
public static void findAndAddClassesInPackageByFile(String packageName,
            String packagePath, final boolean recursive, Set<Class<?>> classes) {
        File dir = new File(packagePath);
        if ((!dir.exists()) || (!dir.isDirectory())) {
            return;
        }
        File[] dirFiles = dir.listFiles(new FileFilter() {
            public boolean accept(File file) {
                return (recursive && (file.isDirectory())) || (file.getName().endsWith(".class"));
            }
        });
        for (File file : dirFiles) {
            if (file.isDirectory()) {
                findAndAddClassesInPackageByFile(packageName + "." + file.getName(),file.getAbsolutePath(), recursive, classes);
            } else {
                String className = file.getName().substring(0,file.getName().length() - 6);
                try {
                    classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName + "." + className));
                } catch (Exception ex) {
                    log.error(ex.getMessage(), ex);
                }
            }
        }
    }

通过扫描包路径获取包内class

时间: 2024-11-08 21:40:07

通过扫描包路径获取包内class的相关文章

通过项目下的包名获取包下的全部类

通过项目下的包名获取包下的全部类 public class GetClasses { public static Set<Class<?>> classes = new HashSet<>(); public static void main(String[] args) { GetAllClass("com.bihang.seayatest.nio"); System.out.println(classes.size()); } public st

Spring根据包名获取包路径下的所有类

参考mybatis MapperScannerConfigurer.java 最终找到 Spring的一个类  ClassPathBeanDefinitionScanner.java 参考ClassPathBeanDefinitionScanner 和它的父类 ClassPathScanningCandidateComponentProvider,将一些代码进行抽取,得到如下工具类. import org.apache.commons.lang3.ArrayUtils; import org.s

Java扫描classpath指定包路径下所有class

在写框架时 经常需要扫描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中通过包名获取该包下的所有class

前面做的在mybatis通过注解自动创建更新表结构的项目,其中在spring加载完毕之后需要去获取所有实体类的class,用来获取实体类属性上的注解,进而分析表结构达到创建修改表结构的目的. 所以就需要一个功能,通过包名获取该包下的所有class,那么直接贴代码: package com.sunchenbin.store.utils; import java.io.File; import java.io.FileFilter; import java.io.IOException; impor

java工具类 获取包下所有类

[java] view plaincopy package com.threeti.util; import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.net.JarURLConnection; import java.net.URL; import java.net.URLDecoder; import java.util.ArrayList; import java.uti

Appium Android 获取包名和 Activity 的几种方法 (转)

本文档主要记录"获取包名和 Activity 的方法",用于自动化测试时启动APP.以下方法主要来源于网络和社区同学的贡献,特此感谢! 1. 方法一: pm list package查看包名 adb shell pm list package -f 将获取手机内所有apk对应的包名和路径 adb shell pm list package -3 -f #获取第三方apk的包 2. 方法二:dumpsys window(本人最常用) 先打开需要查找的apk后,再敲入以上命令 adb sh

python基础】——python添加模块搜索路径和包的导入

方法一:函数添加1 import sys2 查看sys.path3 添加sys.path.append("c:\\") 方法二:修改环境变量w用户可以修改系统环境变量PYTHONPATH 方法三:增加.pth文件,推荐!在site-packages添加一个路径文件,如mypkpath.pth,必须以.pth为后缀,写上你要加入的模块文件所在的目录名称就是了. 1 windows    c:\python27\site-packages# 我们的学员把pth文件直接放在c:\python

java获取包下被指定注解的类

方案一: 采用reflections 框架(此框架依赖com.google.guava) 1.reflections框架地址:https://github.com/ronmamo/reflections 2.项目依赖 <dependency> <groupId>org.reflections</groupId> <artifactId>reflections</artifactId> <version>0.9.11</versi

二.第一个自动化demo,打开APP-如何获取包名和activity。(真机)

环境配置成功后,我们就可以进行第一个自动化测试了.用真机则不需要安装安卓模拟器.以一个简单的打开APP为例. 一.获取包名和activtity      启动一个app,我们需要知道它的平台.版本号.包名.activity等信息,其中两个比较难找的是包名和activtiy,其他的直接在手机或者用Itools都可以看到. 1)在之前配置的安卓SDK文件夹中找到sdkmanager.exe并启动,勾选一个版本的build-tools并下载. 2)下载成功后,找到appt.exe,并将这个路径加到 环