⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jarloader.java

📁 wendang for java. 124342423 432
💻 JAVA
字号:
package javasec.samples.ch12;import java.io.*;import java.net.*;import java.security.*;import java.util.*;import java.util.jar.*;public class JarLoader extends SecureClassLoader {    private URL urlBase;        public boolean printLoadMessages = true;    // These hold the classes and certificates that we read from the jar file    Hashtable classArrays;    Hashtable classIds;    public JarLoader(String base, ClassLoader parent) {        super(parent);        try {            // The base is the URL from which we read jar files; e.g.            // http://piccolo/sdo.jar is read from the base http://piccolo/            // But we can also read classes from the base directly.            if (!(base.endsWith("/")))                base = base + "/";            urlBase = new URL(base);            classArrays = new Hashtable();            classIds = new Hashtable();        } catch (Exception e) {            throw new IllegalArgumentException(base);        }    }    // Completely read the input stream and convert it into a byte array    private byte[] getClassBytes(InputStream is) {        ByteArrayOutputStream baos = new ByteArrayOutputStream();        BufferedInputStream bis = new BufferedInputStream(is);        boolean eof = false;        while (!eof) {            try {                int i = bis.read();                if (i == -1)                    eof = true;                else baos.write(i);            } catch (IOException e) {                return null;            }        }        return baos.toByteArray();    }    // Find the class. This is based on the steps of our previous example    protected Class findClass(final String name) throws ClassNotFoundException {        try {            return (Class)                AccessController.doPrivileged(                    new PrivilegedExceptionAction() {                        public Object run() throws ClassNotFoundException {                            Object o = doFindClass(name);                            if (o == null)                                throw new ClassNotFoundException(name);			    return o;			}                    }                );        } catch (PrivilegedActionException pae) {            throw (ClassNotFoundException) pae.getException();        }    }    private Class doFindClass(String name) {        String urlName = name.replace('.', '/');        byte buf[];        Class cl;        SecurityManager sm = System.getSecurityManager();        if (sm != null) {            int i = name.lastIndexOf('.');            if (i >= 0)                sm.checkPackageDefinition(name.substring(0, i));        }        // See if the class is in a jar file we've read        buf = (byte[]) classArrays.get(urlName);        if (buf != null) {            // It was -- get the certificates (if any) and define the            // codesource and class with them.            java.security.cert.Certificate[] ids =                (java.security.cert.Certificate[]) classIds.get(urlName);            CodeSource cs = new CodeSource(urlBase, ids);            cl = defineClass(name, buf, 0, buf.length, cs);            return cl;        }        // The class wasn't in a jar file -- see if we can load it        // directly. Since it's being loaded directly, it won't have        // a signature.        try {            URL url = new URL(urlBase, urlName + ".class");            if (printLoadMessages)                System.out.println("Loading " + url);            InputStream is = url.openConnection().getInputStream();            buf = getClassBytes(is);            CodeSource cs = new CodeSource(urlBase, null);            cl = defineClass(name, buf, 0, buf.length, cs);            return cl;        } catch (Exception e) {            System.out.println("Can't load " + name + ": " + e);            return null;        }    }    // Read a jar file, storing its classes into the classArray and    // the certificates of its signatures into the classIds    public void readJarFile(String name) {        URL jarUrl = null;        JarInputStream jis;        JarEntry je;        try {            jarUrl = new URL(urlBase, name);        } catch (MalformedURLException mue) {            System.out.println("Unknown jar file " + name);            return;        }        if (printLoadMessages)            System.out.println("Loading jar file " + jarUrl);        try {            jis = new JarInputStream(                        jarUrl.openConnection().getInputStream());        } catch (IOException ioe) {            System.out.println("Can't open jar file " + jarUrl);            return;        }        try {            while ((je = jis.getNextJarEntry()) != null) {                String jarName = je.getName();                if (jarName.endsWith(".class"))                    loadClassBytes(jis, jarName, je);                // else ignore it; it could be an image or audio file                // Really, these type of entries need to be saved for                // the resource methods; we leave that extension to                // the reader.                jis.closeEntry();            }        } catch (IOException ioe) {            System.out.println("Badly formatted jar file");        }    }    private void loadClassBytes(JarInputStream jis,                                    String jarName, JarEntry je) {        if (printLoadMessages)            System.out.println("\t" + jarName);        BufferedInputStream jarBuf = new BufferedInputStream(jis);        ByteArrayOutputStream jarOut = new ByteArrayOutputStream();        int b;        try {            while ((b = jarBuf.read()) != -1)                jarOut.write(b);            String className = jarName.substring(0, jarName.length() - 6);            classArrays.put(className, jarOut.toByteArray());            // This returns the certificates from the signature file            // only if this class was signed.            java.security.cert.Certificate c[] = je.getCertificates();            if (c == null)                c = new java.security.cert.Certificate[0];            classIds.put(className, c);        } catch (IOException ioe) {            System.out.println("Error reading entry " + jarName);        }    }}

⌨️ 快捷键说明

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