获取某包下的类

简介: 获取某包下的类

我们总是喜欢崇敬我们的人,但并不永远喜欢我们所崇敬的人。——拉罗什富科

package io.github.vampireachao.stream.core.clazz;
import io.github.vampireachao.stream.core.lambda.function.SerFunc;
import io.github.vampireachao.stream.core.lambda.function.SerSupp;
import io.github.vampireachao.stream.core.reflect.ReflectHelper;
import io.github.vampireachao.stream.core.stream.Steam;
import java.io.File;
import java.net.URL;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
/**
 * ClassHelper
 *
 * @author VampireAchao
 * @since 2023/1/9
 */
public class ClassHelper {
    private ClassHelper() {
        /* Do not new me! */
    }
    public static List<Class<?>> scanClasses(String packageName) {
        Enumeration<URL> resources = ((SerSupp<Enumeration<URL>>) () ->
                ClassLoader.getSystemClassLoader().getResources(packageName.replace(".", "/"))
        ).get();
        return Steam.of(Collections.list(resources))
                .map(URL::getFile)
                .map((SerFunc<String, File>) f -> new File(URLDecoder.decode(f, StandardCharsets.UTF_8.name())))
                .filter(dir -> dir.exists() && dir.isDirectory())
                .map(File::listFiles)
                .flat(files -> Steam.of(files).map(File::getAbsolutePath)
                        .filter(path -> path.endsWith(".class"))
                        .map(path -> path.substring(path.lastIndexOf("\\") + 1, path.length() - 6))
                        .<Class<?>>map(className -> ReflectHelper.loadClass(packageName + "." + className)))
                .toList();
    }
}


使用:

List<Class<?>> classes = ClassHelper.scanClasses(ClassHelper.class.getPackage().getName());
        Assertions.assertTrue(classes.stream().anyMatch(clazz -> clazz.getName().equals(ClassHelper.class.getName())));
相关文章
|
9月前
|
C#
57.c#:directorylnfo类
57.c#:directorylnfo类
72 0
|
9月前
|
存储 程序员 数据安全/隐私保护
C++类
C++类
63 0
|
8月前
|
存储 安全 C#
C# 类的深入指南
C# 类的深入指南
|
9月前
|
C# 数据安全/隐私保护
56.c#:filelnfo类
56.c#:filelnfo类
72 2
|
9月前
|
Java
JAVASystem类
JAVASystem类
41 0
|
9月前
|
存储 编译器 C++
c++类全面讲解
前言 这次主要讲类的基础、构造函数与析构函数的使用,以及继承和多态。
144 0
|
存储 Linux iOS开发
NSFileManager类
NSFileManager类
242 0
NSFileManager类
|
存储 iOS开发 开发者
NSBundle类
NSBundle类
193 0
NSBundle类