Here's a more complete way to solve this for jars, based on the idea posted by JG.
/**
* Scans all classloaders for the current thread for loaded jars, and then scans
* each jar for the package name in question, listing all classes directly under
* the package name in question. Assumes directory structure in jar file and class
* package naming follow java conventions (i.e. com.example.test.MyTest would be in
* /com/example/test/MyTest.class)
*/
public Collection<Class> getClassesForPackage(String packageName) throws Exception {
String packagePath = packageName.replace(".", "/");
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Set<URL> jarUrls = new HashSet<URL>();
while (classLoader != null) {
if (classLoader instanceof URLClassLoader)
for (URL url : ((URLClassLoader) classLoader).getURLs())
if (url.getFile().endsWith(".jar") // may want better way to detect jar files
jarUrls.add(url);
classLoader = classLoader.getParent();
}
Set<Class> classes = new HashSet<Class>();
for (URL url : jarUrls) {
JarInputStream stream = new JarInputStream(url.openStream()); // may want better way to open url connections
JarEntry entry = stream.getNextJarEntry();
while (entry != null) {
String name = entry.getName();
int i = name.lastIndexOf("/");
if (i > 0 && name.endsWith(".class") && name.substring(0, i).equals(packagePath))
classes.add(Class.forName(name.substring(0, name.length() - 6).replace("/", ".")));
entry = stream.getNextJarEntry();
}
stream.close();
}
return classes;
}
There is no global way to do that. That being said, if you know where your classes are coming from, you can walk the directory of a jar file or the file system.
Most products that have the ability to add (discover) new classes either have a text file describing "Program Extensions" or a specific directory where you can place either classes or jars that uses a trick like @JG described. (This is what eclipse does and is recommended for any solution where the user may add the new module by hand)
The above answers outline the required functionality. However, more details on the subject can be found here and here.
You can't. Classes can come in via many different class loaders, including remote ones.
Here's a more complete way to solve this for jars, based on the idea posted by JG.
There's a snippet from here that does exactly what you want, assuming the classes can be found locally:
There is no global way to do that. That being said, if you know where your classes are coming from, you can walk the directory of a jar file or the file system.
Java doesn't have discovery.
Most products that have the ability to add (discover) new classes either have a text file describing "Program Extensions" or a specific directory where you can place either classes or jars that uses a trick like @JG described. (This is what eclipse does and is recommended for any solution where the user may add the new module by hand)