美文网首页
扫描jar包中所有类的工具

扫描jar包中所有类的工具

作者: TinyThing | 来源:发表于2020-04-15 10:22 被阅读0次

项目中要使用热加载,所以写了一个工具类,用于扫描指定路径下的jar包中的所有类;
代码如下:

@Slf4j
public class JarUtils {

    private static final String CLASS_SUFFIX = ".class";


    public Set<Class<?>> loadAllClass(String jarPath) throws IOException, ClassNotFoundException {
        Set<Class<?>> classSet = new HashSet<>(16);

        URL url = new URL(jarPath);
        URLClassLoader classLoader = new URLClassLoader(new URL[]{url}, getClass().getClassLoader());

        JarFile jarFile = new JarFile(jarPath);
        Enumeration<JarEntry> entries = jarFile.entries();

        while (entries.hasMoreElements()) {
            JarEntry jarEntry = entries.nextElement();
            String jarName = jarEntry.getName();
            System.out.println(jarName);
            if (!jarEntry.isDirectory() && jarName.endsWith(CLASS_SUFFIX)) {
                // 将文件路径名转换为包名称的形式
                String className = jarName.replace(CLASS_SUFFIX, "");
                className = ClassUtils.convertResourcePathToClassName(className);
                Class<?> aClass = classLoader.loadClass(className);
                classSet.add(aClass);
            }
        }

        return classSet;
    }

    public Set<Class<?>> getClassByParent(String jarPath, Class<?> superClass) {
        Set<Class<?>> classSet;
        try {
            classSet = loadAllClass(jarPath);
        } catch (ClassNotFoundException e) {
            log.error("- can not find class", e);
            throw new RuntimeException("ClassNotFoundException");
        } catch (IOException e2) {
            log.error("- read jar error", e2);
            throw new RuntimeException("read jar error");
        }

        return classSet.stream()
                .filter(superClass::isAssignableFrom)
                .collect(Collectors.toSet());
    }



}

相关文章

网友评论

      本文标题:扫描jar包中所有类的工具

      本文链接:https://www.haomeiwen.com/subject/spmqvhtx.html