code: public void find(String packageName, final Class<?> parentType) {
          this.parentType = parentType;
          packageName = packageName.replace('.', '/');
          final Enumeration<URL> urls;
  
          try {
              urls = loader.getResources(packageName);
          }
          catch (IOException ioe) {
              log.warn("Could not read package: " + packageName, ioe);
              return;
          }
  
          while (urls.hasMoreElements()) {
              try {
                  String urlPath = urls.nextElement().getFile();
                  urlPath = URLDecoder.decode(urlPath, "UTF-8");
                  if ( urlPath.startsWith("file:") ) {
                      urlPath = urlPath.substring(5);
                  }
                  if (urlPath.indexOf('!') > 0) {
                      urlPath = urlPath.substring(0, urlPath.indexOf('!'));
                  }
                  if (jarPath != null && !jarPath.equals(urlPath)) {
                      continue;
                  }
  
                  //Log.info("Looking for classes in location: " + urlPath);
                  final File file = new File(urlPath);
                  if ( file.isDirectory() ) {
                      scanDir(file, packageName);
                  }
                  else {
                      scanJar(file, packageName);
                  }
              }
              catch (IOException ioe) {
                  log.warn("could not read entries", ioe);
              }
          }
      }
docs: Scans the classpath for classes within the specified package and sub-packages that
  extend the parentType. This method can be called repeatedly
  with different packages. Classes are accumulated internally and
  can be accessed by calling {@link #getClasses()}.