package com.ultikits.ultitools.utils; import com.google.common.reflect.ClassPath; import org.bukkit.Bukkit; import java.lang.annotation.Annotation; import java.util.HashSet; import java.util.Set; import java.util.logging.Level; public class PackageScanUtils { /** * @param targetAnnotation the target annotation class
目标注解类 * @param packageName the package name
包名 * @param classLoader the class loader
类加载器 * @return the set of classes
类集合 */ public static Set> scanAnnotatedClasses( Class targetAnnotation, String packageName, ClassLoader classLoader ) { Set> classes = new HashSet<>(); try { ClassPath classPath = ClassPath.from(classLoader); for (ClassPath.ClassInfo classInfo : classPath.getTopLevelClassesRecursive(packageName)) { Class c = Class.forName(classInfo.getName(), true, classLoader); if (c.isAnnotationPresent(targetAnnotation)) { classes.add(c); } } } catch (Exception | Error e) { Bukkit.getLogger().log(Level.SEVERE, "Failed to scan annotated classes", e); } return classes; } }