Preface
The code below gets all classes within a given package. Notice that it should only work for classes found locally, getting really ALL classes is impossible.
Sample Code
Consider the project has below package hierarchy:
Try below sample code:
- test.Test.java
- package test;
- 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 Test {
- public static class A{
- String name;
- }
- /**
- * 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
- */
- private static List
GetClasses(String packageName) - throws ClassNotFoundException, IOException {
- ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- assert classLoader != null;
- String path = packageName.replace('.', '/');
- Enumeration
resources = classLoader.getResources(path); - List
dirs = new ArrayList (); - while (resources.hasMoreElements()) {
- URL resource = resources.nextElement();
- dirs.add(new File(resource.getFile()));
- }
- ArrayList
classes = new ArrayList (); - 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
- */
- private static List
FindClasses(File directory, String packageName) throws ClassNotFoundException { - List
classes = new ArrayList (); - 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;
- }
- public static void main(String args[]) throws Exception
- {
- String pkg = "test";
- System.out.printf("\t[Info] Search package: %s\n", pkg);
- for(Class clz:GetClasses(pkg))
- {
- System.out.printf("\t%s\n", clz.getName());
- }
- }
- }
沒有留言:
張貼留言