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 + -
显示快捷键?