尽管如此,追寻到class的根源有时候在程序测试和debug的时候会很有用,由于这个想法,我给出了一种很有帮助的方法能够替我们完成这个任务,这些所有都是基于j2se的api的. /** * Given a Class object, attempts to find its .class location [returns null * if no sUCh definition can be found]. 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: cls");
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 // document.d to be legal, but Sun's implementations seem to //allow this: final ClassLoader clsLoader = cls.getClassLoader ();