JavaWorld has a great article on finding a class’s runtime origin called Back to your Class roots. Below is the highly useful getClassLocation method from the article.
/**
* Given a Class object, attempts to find its .class location.
* Use for testing/debugging only.
*
* @return URL that points to the class definition; null if not found
*/
public static URL getClassLocation (final Class cls) {
if (cls == null) throw new IllegalArgumentException ("null input");
URL result = null;
final String clsAsResource = cls.getName ().replace ('.', '/').concat (".class");
final ProtectionDomain pd = cls.getProtectionDomain ();
// java.lang.Class contract does not specify if 'pd' can ever be
// null; it is not the case for Sun's implementations, but guard
// against null just in case:
if (pd != null) {
final CodeSource cs = pd.getCodeSource ();
// 'cs' can be null depending on the classloader behavior:
if (cs != null) result = cs.getLocation ();
if (result != null) {
// Convert a code source location into a full class file location
// for some common cases:
if ("file".equals (result.getProtocol ())) {
try {
if (result.toExternalForm ().endsWith (".jar") ||
result.toExternalForm ().endsWith (".zip"))
result = new URL ("jar:".concat (result.toExternalForm ())
.concat("!/").concat (clsAsResource));
else if (new File (result.getFile ()).isDirectory ())
result = new URL (result, clsAsResource);
}
catch (MalformedURLException ignore) {}
}
}
}
if (result == null) {
// Try to find 'cls' definition as a resource; this is not
// documented to be legal, but Sun's implementations seem to allow
// this:
final ClassLoader clsLoader = cls.getClassLoader ();
result = clsLoader != null ?
clsLoader.getResource (clsAsResource) :
ClassLoader.getSystemResource (clsAsResource);
}
return result;
}