001package com.ganteater.ae.util; 002 003import java.util.ArrayList; 004import java.util.HashMap; 005import java.util.List; 006import java.util.Map; 007import java.util.ServiceLoader; 008import java.util.stream.Collectors; 009 010import org.apache.commons.collections.ListUtils; 011import org.apache.commons.lang.StringUtils; 012 013public class ClassUtils { 014 015 private static Map<Class<?>, List<Class<?>>> classMap = new HashMap<>(); 016 017 public static List<Class<?>> findAssignable(Class<?> parrent) { 018 List<Class<?>> list = classMap.get(parrent); 019 if (list == null) { 020 list = scanClasses(parrent); 021 } 022 return list; 023 } 024 025 private static List<Class<?>> scanClasses(Class<?> parrent) { 026 ServiceLoader<?> loader = ServiceLoader.load(parrent); 027 for (Object service : loader) { 028 classMap.computeIfAbsent(parrent, k -> new ArrayList<>()).add(service.getClass()); 029 } 030 if (classMap.get(parrent) == null) { 031 classMap.put(parrent, ListUtils.EMPTY_LIST); 032 } 033 return classMap.get(parrent); 034 } 035 036 public static String[] findAssignable(Class<?> clazz, Package defaultPackage) { 037 String defaultPackageName = defaultPackage.getName() + "."; 038 String[] processors = findAssignable(clazz).stream() 039 .map(pc -> { 040 String name = pc.getName(); 041 if (name.startsWith(defaultPackageName)) { 042 name = StringUtils.substringAfter(name, defaultPackageName); 043 } 044 return name; 045 }) 046 .collect(Collectors.toList()) 047 .toArray(new String[0]); 048 return processors; 049 } 050}