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

📄 decoratingclassloader.java

📁 《透视Java》的源码
💻 JAVA
字号:
package covertjava.classloader;import java.util.*;import java.io.*;import java.util.zip.*;/*** <p>Custom class loader that delegates to a decorator for runtime bytecode instrumentation</p>* <p>Copyright: Copyright (c) 2004 Sams Publishing</p>* @author Alex Kalinovsky* @version 1.0*/public class DecoratingClassLoader extends ClassLoader {    protected ClassDecorator decorator;    protected ArrayList classPathItems = new ArrayList();    public DecoratingClassLoader() {        this(System.getProperty("decorate.class.path"));    }    public DecoratingClassLoader(String classPath) {        parseClassPath(classPath);    }    public ClassDecorator getDecorator() {        return this.decorator;    }    public void setDecorator(ClassDecorator decorator) {        this.decorator = decorator;    }    protected void parseClassPath(String classPath) {        if (classPath == null)            throw new IllegalArgumentException("DecoratingClassLoader must be initialized with class path (\"decorate.class.path\" system property is used by default)");        String separator = System.getProperty("path.separator");        StringTokenizer pathTokenizer = new StringTokenizer(classPath, separator);        while (pathTokenizer.hasMoreTokens()) {            classPathItems.add(pathTokenizer.nextToken());        }    }    protected Class findClass(String name) throws ClassNotFoundException {        System.out.println("DecoratingClassLoader loading class " + name);        byte[] bytes = getClassBytes(name);        if (getDecorator() != null)            bytes = getDecorator().decorateClass(name, bytes);        return defineClass(name, bytes, 0, bytes.length);    }    protected byte[] getClassBytes(String className) throws ClassNotFoundException {        byte[] bytes = null;        for (int i= 0; i < classPathItems.size(); i++) {            String path = (String)classPathItems.get(i);            String fileName = className.replace('.', '/') + ".class";            if (isJar(path) == true) {                bytes = loadJarBytes(path, fileName);            }            else {                bytes = loadFileBytes(path, fileName);            }            if (bytes != null)                break;        }        if (bytes == null)            throw new ClassNotFoundException(className);        return bytes;    }    boolean isJar(String pathEntry) {        return pathEntry.endsWith(".jar") || pathEntry.endsWith(".zip");    }    protected byte[] loadFileBytes(String path, String fileName) {        File file= new File(path, fileName);        if (file.exists()) {            return loadClassBytes(file);        }        return null;    }    protected byte[] loadClassBytes(File f) {        try {            FileInputStream stream = new FileInputStream(f);            ByteArrayOutputStream out = new ByteArrayOutputStream(1000);            byte[] b = new byte[1000];            int n;            while ((n= stream.read(b)) != -1)                out.write(b, 0, n);            stream.close();            out.close();            return out.toByteArray();        } catch (IOException e) {        }        return null;    }    protected byte[] loadJarBytes(String path, String fileName) {        ZipFile zipFile = null;        InputStream stream = null;        File archive = new File(path);        if (!archive.exists())            return null;        try {            zipFile= new ZipFile(archive);        } catch(IOException io) {            return null;        }        ZipEntry entry= zipFile.getEntry(fileName);        if (entry == null)            return null;        int size = (int) entry.getSize();        try {            stream = zipFile.getInputStream(entry);            byte[] bytes = new byte[size];            int pos = 0;            while (pos < size) {                int n= stream.read(bytes, pos, bytes.length - pos);                pos += n;            }            zipFile.close();            return bytes;        }        catch (IOException e) {        }        finally {            try {                if (stream != null)                    stream.close();            } catch (IOException e) {            }        }        return null;    }}

⌨️ 快捷键说明

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