|
4 | 4 | import com.google.common.reflect.ClassPath; |
5 | 5 | import me.dustin.jex.JexClient; |
6 | 6 |
|
| 7 | +import java.io.File; |
7 | 8 | import java.io.IOException; |
| 9 | +import java.net.URISyntaxException; |
| 10 | +import java.net.URL; |
8 | 11 | import java.util.ArrayList; |
| 12 | +import java.util.Enumeration; |
9 | 13 | import java.util.List; |
10 | 14 |
|
11 | 15 | public enum ClassHelper { |
12 | 16 | INSTANCE; |
13 | 17 |
|
| 18 | + public ArrayList<Class<?>> getClassesOther(String packageName, Class<?> assignableFrom) throws IOException, ClassNotFoundException, URISyntaxException { |
| 19 | + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); |
| 20 | + assert classLoader != null; |
| 21 | + String path = packageName.replace('.', '/'); |
| 22 | + Enumeration<URL> resources = classLoader.getResources(path); |
| 23 | + List<File> dirs = new ArrayList<File>(); |
| 24 | + while (resources.hasMoreElements()) { |
| 25 | + URL resource = resources.nextElement(); |
| 26 | + try { |
| 27 | + dirs.add(new File(resource.toURI())); |
| 28 | + } catch (IllegalArgumentException e) { |
| 29 | + dirs.add(new File(resource.getFile())); |
| 30 | + } |
| 31 | + } |
| 32 | + ArrayList<Class<?>> classes = new ArrayList<>(); |
| 33 | + for (File directory : dirs) { |
| 34 | + classes.addAll(findClasses(directory, packageName, assignableFrom)); |
| 35 | + } |
| 36 | + ArrayList<Class<?>> removedDupes = new ArrayList<>(); |
| 37 | + for (Class<?> clazz : classes) { |
| 38 | + if (!removedDupes.contains(clazz)) |
| 39 | + removedDupes.add(clazz); |
| 40 | + } |
| 41 | + return removedDupes; |
| 42 | + } |
| 43 | + |
| 44 | + private static List<Class<?>> findClasses(File directory, String packageName, Class<?> assignableFrom) throws ClassNotFoundException { |
| 45 | + List<Class<?>> classes = new ArrayList<>(); |
| 46 | + if (!directory.exists()) { |
| 47 | + return classes; |
| 48 | + } |
| 49 | + File[] files = directory.listFiles(); |
| 50 | + assert files != null; |
| 51 | + for (File file : files) { |
| 52 | + if (file.isDirectory()) { |
| 53 | + assert !file.getName().contains("."); |
| 54 | + classes.addAll(findClasses(file, packageName + "." + file.getName(), assignableFrom)); |
| 55 | + } else if (file.getName().endsWith(".class")) { |
| 56 | + Class<?> clazz = Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6)); |
| 57 | + if (assignableFrom.isAssignableFrom(clazz)) |
| 58 | + classes.add(clazz); |
| 59 | + } else { |
| 60 | + } |
| 61 | + } |
| 62 | + return classes; |
| 63 | + } |
| 64 | + |
14 | 65 | @SuppressWarnings("UnstableApiUsage") |
15 | 66 | public List<Class<?>> getClasses(String packageName, Class<?> assignableFrom) { |
16 | 67 | List<Class<?>> classes = new ArrayList<>(); |
|
0 commit comments