package edu.berkeley.nlp.util; import java.io.File; import java.net.JarURLConnection; import java.net.URL; import java.net.URLDecoder; import java.util.*; import java.util.jar.JarEntry; import java.util.jar.JarFile; /** * Created by IntelliJ IDEA. * User: aria42 * Date: Dec 7, 2008 */ public class ReflectionUtils { public static List<Class> getClassesForPackage(String pckgname) { List<Class> classes = new ArrayList<Class>(); ArrayList<File> directories = new ArrayList<File>(); char fileSep = System.getProperty("file.separator").charAt(0); try { ClassLoader cld = Thread.currentThread().getContextClassLoader(); if (cld == null) { throw new ClassNotFoundException("Can't get class loader."); } Enumeration<URL> resources = cld.getResources(pckgname.replace('.', fileSep)); while (resources.hasMoreElements()) { URL res = resources.nextElement(); if (res.getProtocol().equalsIgnoreCase("jar")) { JarURLConnection conn = (JarURLConnection) res.openConnection(); JarFile jar = conn.getJarFile(); for (JarEntry e : Collections.list(jar.entries())) { if (e.getName().startsWith(pckgname.replace('.', fileSep)) && e.getName().endsWith(".class") && !e.getName().contains("$")) { String className = e.getName().replace(""+ fileSep, ".").substring(0, e.getName().length() - 6); classes.add(Class.forName(className)); } } } else { directories.add(new File(URLDecoder.decode(res.getPath(), "UTF-8"))); } } } catch (Exception e) { e.printStackTrace(); } for (File directory : directories) { if (directory.exists()) { String[] files = directory.list(); for (String file : files) { if (file.endsWith(".class")) { String className = file.substring(0, file.length() - 6); try { classes.add(Class.forName(pckgname + '.' + className)); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } } } return classes; } public static List<Class> getClassessOfInterface(String thePackage, Class theInterface) { List<Class> classList = new ArrayList<Class>(); try { for (Class discovered : getClassesForPackage(thePackage)) { if (Arrays.asList(discovered.getInterfaces()).contains(theInterface)) { classList.add(discovered); } } } catch (Exception e) { e.printStackTrace(); } return classList; } }