Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  
  package bpiwowar.argparser.utils;
  
  import java.io.File;
  import java.net.URL;
 
Methods used for introspection

Author(s):
B. Piwowarski
Date:
24/11/2006
 
 public class Introspection {
 	public static Logger logger = Logger.getLogger();

Get the list of class which implement a given class

Parameters:
which The base class
packageName the package where classes are searched
levels number of levels to be explored (-1 for infinity)
Returns:
an array of objects of the given class
 
 	static public Class<?>[] getImplementors(final Class<?> which,
 			final String packageNamefinal int levels) {
 		final ArrayList<Class<?>> list = new ArrayList<Class<?>>();
 		Introspection.addImplementors(listwhichpackageNamelevels);
 		final Class<?>[] objects = (Class<?>[]) java.lang.reflect.Array
 				.newInstance(Class.classlist.size());
 		return list.toArray(objects);
 	}

A checker class

Author(s):
bpiwowar
Date:
Nov 7, 2007
 
 	public interface Checker {
 		boolean accepts(Class<?> aClass);
 	}
 
 	public static void addImplementors(final ArrayList<Class<?>> list,
 			final Class<?> whichfinal String packageNamefinal int levels) {
 		addClasses(new Checker() {
 			public boolean accepts(Class<?> aClass) {
 				return which.isAssignableFrom(aClass);
 			}
 
 		}, listpackageNamelevels);
 	}
 
 	static public ArrayList<Class<?>> getClasses(final Checker checker,
 			final String packageNamefinal int levels) {
 		final ArrayList<Class<?>> list = new ArrayList<Class<?>>();
 		Introspection.addClasses(checkerlistpackageNamelevels);
 		return list;
 	}

Add classes to the list

Parameters:
checker Used to filter the classes
list The list to fill
packageName The package to be analyzed
levels The maximum number of recursion within the structure (or -1 if infinite)
 
 	public static void addClasses(final Checker checker,
 			final ArrayList<Class<?>> listfinal String packageName,
 			final int levels) {
 		final String name = "/" + packageName.replace('.''/');
 
 		// Get a File object for the package
 		final URL url = Introspection.class.getResource(name);
 		if (url == null)
 			return;
 
 		addClasses(checkerlistpackageNamelevelsurl);
 	}

Parameters:
checker
list
packageName
levels
url
	public static void addClasses(final Checker checker,
			final ArrayList<Class<?>> listfinal String packageName,
			final int levelsfinal URL url) {
		final File directory = new File(url.getFile());
		// File directory
		if (directory.exists())
			addClasses(checkerlistpackageNamelevelsdirectory);
		else
			try {
				// It does not work with the filesystem: we must
				// be in the case of a package contained in a jar file.
				final JarURLConnection conn = (JarURLConnectionurl
				addClasses(checkerlistlevelsconnpackageName.replace(
						'.''/'));
catch (final IOException ioex) {
			}
	}

Parameters:
checker
list
levels
conn
prefix
Throws:
java.io.IOException
	public static void addClasses(final Checker checker,
			final ArrayList<Class<?>> listfinal int levels,
			final JarURLConnection connfinal String prefix)
			throws IOException {
		final JarFile jfile = conn.getJarFile();
		.debug("Exploring jar file %s with prefix %s"jfile.getName(),
				prefix);
		final Enumeration<?> e = jfile.entries();
		while (e.hasMoreElements()) {
			final ZipEntry entry = (ZipEntrye.nextElement();
			final String entryname = entry.getName();
			if (entryname.startsWith(prefix) && entryname.endsWith(".class")) {
				// Check the number of levels
				if (levels >= 0) {
					int n = 0;
					for (int i = prefix.length() + 1; i < entryname.length()
							&& n <= levelsi++)
						if (entryname.charAt(i) == '/')
							n++;
					if (n > levels)
						continue;
				}
				String classname = entryname.substring(0,
						entryname.length() - 6);
				if (classname.startsWith("/"))
					classname = classname.substring(1);
				classname = classname.replace('/''.');
				try {
					.debug("Testing class " + classname);
					final Class<?> oclass = Class.forName(classname);
					if (checker.accepts(oclass))
						list.add(oclass);
catch (final Exception ex) {
					.debug("Caught exception " + ex);
				}
			}
		}
	}

Parameters:
checker
list
packageName
levels
directory
	public static void addClasses(final Checker checker,
			final ArrayList<Class<?>> listfinal String packageName,
			final int levelsfinal File directory) {
		// Get the list of the files contained in the package
		final File[] files = directory.listFiles();
		if (files != null) {
			for (int i = 0; i < files.lengthi++) {
				// we are only interested in .class files
				if (levels != 0 && files[i].isDirectory())
					addClasses(checkerlistpackageName + "."
files[i].getName(), levels - 1);
				if (files[i].getName().endsWith(".class")) {
					// removes the .class extension
					String classname = files[i].getName().substring(0,
							files[i].getName().length() - 6);
					// Try to create an instance of the object
					try {
						classname = packageName + "." + classname;
						final Class<?> oclass = Class.forName(classname);
						if (checker.accepts(oclass))
							list.add(oclass);
catch (final Exception e) {
					}
				}
			}
		}
	}
New to GrepCode? Check out our FAQ X