Получение классов из пакета

  1. public class ClassFinder {
  2.  
  3.     private static final char PKG_SEPARATOR = '.';
  4.  
  5.     private static final char DIR_SEPARATOR = '/';
  6.  
  7.     private static final String CLASS_FILE_SUFFIX = ".class";
  8.  
  9.     private static final String BAD_PACKAGE_ERROR = "Unable to get resources from path '%s'. Are you sure the package '%s' exists?";
  10.  
  11.     public static List<Class<?>> find(String scannedPackage) {
  12.         String scannedPath = scannedPackage.replace(PKG_SEPARATOR, DIR_SEPARATOR);
  13.         URL scannedUrl = Thread.currentThread().getContextClassLoader().getResource(scannedPath);
  14.         if (scannedUrl == null) {
  15.             throw new IllegalArgumentException(String.format(BAD_PACKAGE_ERROR, scannedPath, scannedPackage));
  16.         }
  17.         File scannedDir = new File(scannedUrl.getFile());
  18.         List<Class<?>> classes = new ArrayList<Class<?>>();
  19.         for (File file : scannedDir.listFiles()) {
  20.             classes.addAll(find(file, scannedPackage));
  21.         }
  22.         return classes;
  23.     }
  24.  
  25.     private static List<Class<?>> find(File file, String scannedPackage) {
  26.         List<Class<?>> classes = new ArrayList<Class<?>>();
  27.         String resource = scannedPackage + PKG_SEPARATOR + file.getName();
  28.         if (file.isDirectory()) {
  29.             for (File child : file.listFiles()) {
  30.                 classes.addAll(find(child, resource));
  31.             }
  32.         } else if (resource.endsWith(CLASS_FILE_SUFFIX)) {
  33.             int endIndex = resource.length() - CLASS_FILE_SUFFIX.length();
  34.             String className = resource.substring(0, endIndex);
  35.             try {
  36.                 classes.add(Class.forName(className));
  37.             } catch (ClassNotFoundException ignore) {
  38.             }
  39.         }
  40.         return classes;
  41.     }
  42.  
  43. }
Вспомогательный класс для получения всех классов из пакета
Использовать:
  1. List<Class<?>> list = ClassFinder.find("com.wdeath.game.clazz");

Реклама

Мы в соцсетях

tw tg yt gt