Java Class from Package getClasses(String packageName, Class inheritedType)

Here you can find the source of getClasses(String packageName, Class inheritedType)

Description

Scans all classes accessible from the context class loader which belong to the given package and subpackages.

License

Apache License

Parameter

Parameter Description
T a parameter
packageName The base package

Exception

Parameter Description
ClassNotFoundException an exception
IOException an exception

Return

The classes

Declaration

@SuppressWarnings("unchecked")
public static <T> ArrayList<Class<? extends T>> getClasses(String packageName, Class<T> inheritedType) 

Method Source Code

//package com.java2s;
//License from project: Apache License 

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

public class Main {
    /**//  w  w w . j a v  a 2s .c o  m
      * Scans all classes accessible from the context class loader which belong to the given package and subpackages. <b>if it is extended from inheritedtype</b>
        
     * @param <T>
      * @param packageName The base package
      * @return The classes
      * @throws ClassNotFoundException
      * @throws IOException
      */
    @SuppressWarnings("unchecked")
    public static <T> ArrayList<Class<? extends T>> getClasses(String packageName, Class<T> inheritedType) {
        ArrayList<Class<? extends T>> result = new ArrayList<Class<? extends T>>();
        ArrayList<Class<?>> classes = new ArrayList<Class<?>>();
        try {
            classes = getClasses(packageName);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        for (Class<?> next : classes) {
            Class<?> superClass = next.getSuperclass();
            while (!superClass.equals(Object.class)) {
                if (superClass.equals(inheritedType))
                    result.add((Class<? extends T>) next);
                superClass = superClass.getSuperclass();
            }
        }
        return result;
    }

    /**
     * Scans all classes accessible from the context class loader which belong to the given package and subpackages.
     *
     * @param packageName The base package
     * @return The classes
     * @throws ClassNotFoundException
     * @throws IOException
     */
    public static ArrayList<Class<?>> getClasses(String packageName) throws ClassNotFoundException, IOException {
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        assert classLoader != null;
        String path = packageName.replace('.', '/');
        Enumeration<URL> resources = classLoader.getResources(path);
        List<File> dirs = new ArrayList<File>();
        while (resources.hasMoreElements()) {
            URL resource = resources.nextElement();
            dirs.add(new File(resource.getFile()));
        }
        ArrayList<Class<?>> classes = new ArrayList<Class<?>>();
        for (File directory : dirs) {
            classes.addAll(findClasses(directory, packageName));
        }

        return classes;
    }

    /**
     * Recursive method used to find all classes in a given directory and subdirs.
     *
     * @param directory   The base directory
     * @param packageName The package name for classes found inside the base directory
     * @return The classes
     * @throws ClassNotFoundException
     */
    public static List<Class<?>> findClasses(File directory, String packageName) throws ClassNotFoundException {
        List<Class<?>> classes = new ArrayList<Class<?>>();
        if (!directory.exists()) {
            return classes;
        }
        File[] files = directory.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {
                assert !file.getName().contains(".");
                classes.addAll(findClasses(file, packageName + "." + file.getName()));
            } else if (file.getName().endsWith(".class")) {
                classes.add(Class
                        .forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6)));
            }
        }
        return classes;
    }
}

Related

  1. getClasses(String packageName)
  2. getClasses(String packageName)
  3. getClasses(String packageName)
  4. getClasses(String packageName)
  5. getClasses(String packageName)
  6. getClasses(String pckgname)
  7. getClasses(String pckgname)
  8. getClasses(String pkg)
  9. getClasses(String pkg)