urlclassloader.java

来自「gcc3.2.1源代码」· Java 代码 · 共 259 行

JAVA
259
字号
/* Copyright (C) 1999, 2000  Free Software Foundation   This file is part of libgcj.This software is copyrighted work licensed under the terms of theLibgcj License.  Please consult the file "LIBGCJ_LICENSE" fordetails.  */package java.net;import java.io.*;import java.util.jar.*;import java.util.Enumeration;import java.util.Vector;public class URLClassLoader extends ClassLoader {  // The URLStreamHandlerFactory  URLStreamHandlerFactory factory = null;  // `path' contains simply the URL's we're using for the searching.  private Vector path;   // If path[n] is a zip/jar, then this holds a JarURLConnection for  // that thing, otherwise, path[n] is null.  private Vector info;   private URLStreamHandler getHandler0 (String protocol)  {    if (factory != null)      return factory.createURLStreamHandler(protocol);    else      return null;  }  public URLClassLoader (URL[] urls)  {     this (urls, null, null);  }    public URLClassLoader (URL[] urls, ClassLoader parent)  {     this (urls, parent, null);  }  // A File URL may actually be a Jar URL.  Convert if possible.  private URL jarFileize (URL url)  {    if (! url.getProtocol ().equals ("jar"))      {	String f = url.getFile ();	// If it ends with '/' we'll take it for a directory,	// otherwise it's a jar file.  This is how JDK 1.2 defines	// it, so we will not try to be smart here.	if (f.charAt (f.length ()-1) != '/')	  {	    try	      {		url = new URL ("jar", "", -1, (url.toExternalForm ())+"!/", 			       getHandler0 ("jar"));	      } 	    catch (MalformedURLException x)	      {		/* ignore */	      }	  }      }    return url;  }  protected void addURL (URL url)  {    JarURLConnection conn = null;        // Convert a Jar File URL into Jar URL if possible.    url = jarFileize (url);    path.addElement (url);    if (url.getProtocol ().equals ("jar"))      {	try	  {	    conn = (JarURLConnection) url.openConnection ();	  }	catch (java.io.IOException x)	  {	    /* ignore */	  }      }    info.addElement (conn);  }  public URLClassLoader (URL[] urls, ClassLoader parent,			 URLStreamHandlerFactory fac)  {     super (parent);    factory = fac;    if (urls == null || urls.length == 0)      {	path = new Vector (1);	info = new Vector (1);	return;      }    path = new Vector (urls.length);    info = new Vector (urls.length);    for (int i = 0; i < urls.length; i++)      {	// Convert a Jar File URL into a Jar URL is possible. 	URL u = jarFileize(urls[i]);	path.addElement (u);	if (u.getProtocol ().equals ("jar"))	  {	    JarURLConnection conn = null;	    try	      {		conn = (JarURLConnection) u.openConnection ();	      }	    catch (java.io.IOException x)	      {		/* ignore */	      }	    info.addElement (conn);	  }	else	  {	    info.addElement (null);	  }      }  }  public URL[] getURLs ()  {    URL[] urls = new URL[path.size()];    path.copyInto (urls);    return urls;  }    public Enumeration findResources (String name)  {    Vector results = new Vector ();    for (int i = 0; i < path.size(); i++)      {	URL u = (URL)path.elementAt (i);			try {	  JarURLConnection conn = (JarURLConnection) info.elementAt (i);	  	  if (conn != null)	    {	      if (conn.getJarFile().getJarEntry (name) != null)		results.addElement (new URL(u, name, getHandler0 (u.getProtocol())));	    }	  else	    {	      URL p = new URL (u, name, getHandler0 (u.getProtocol()));			    	      InputStream is = p.openStream();	      if (is != null)		{		  is.close();		  results.addElement (p);		}	    }		    	  // if we get an exception ... try the next path element	} catch (IOException x) {	  continue;	}      }	    return results.elements ();  }  public URL findResource (String name)  {    for (int i = 0; i < path.size(); i++)      {	URL u = (URL)path.elementAt (i);		try {	  JarURLConnection conn = (JarURLConnection) info.elementAt (i); 	  	  if (conn != null)	    {	      if (conn.getJarFile().getJarEntry (name) != null)		return new URL(u, name, getHandler0 (u.getProtocol()));	    }	  else	    {	      URL p = new URL (u, name, getHandler0 (u.getProtocol()));	      InputStream is = p.openStream();	      if (is != null)		{		  is.close();		  return p;		}	    }		  // if we get an exception ... try the next path element	} catch (IOException x) {	  continue;	}      }    return null;  }  // and finally, we can implement our class loader functionality.  protected Class findClass (String name)    throws ClassNotFoundException  {    if (name == null)      throw new ClassNotFoundException ("null");    try       {	URL u = getResource (name.replace ('.', '/') + ".class");	if (u == null)	  throw new ClassNotFoundException (name);	URLConnection connection = u.openConnection ();	InputStream is = connection.getInputStream ();	int len = connection.getContentLength ();	byte[] data = new byte[len];	int left = len;	int off  = 0;	while (left > 0)	  {	    int c = is.read (data, off, len-off);	    if (c == -1 || c == 0)	      throw new InternalError ("premature end of file");	    left -= c;	    off += c;	  }	return defineClass (name, data, 0, len);      }     catch (java.io.IOException x)      {	throw new ClassNotFoundException(name);      }  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?