View Javadoc

1   package ca.spaz.util;
2   
3   import java.io.*;
4   import java.util.zip.*;
5   
6   import javax.swing.ImageIcon;
7    
8   /***
9    * A special class for loading classes from an jar file.
10   * 
11   * @author Aaron Davidson
12   */
13  public final class Loader extends ClassLoader {
14     private ZipFile archive; 
15  
16     public Loader(File file) {
17        try {
18           archive = new ZipFile(file);
19        } catch (Exception e) {
20           e.printStackTrace(); 
21        }  
22     }
23     
24     /***
25      * Create a new instance of a class in this jar file.
26      * Must have a basic constructor with no arguments.
27      * 
28      * @param name the class name to instantiate
29      * 
30      * @return an Object created from the given class
31      */
32     public Object newInstance(String name) {
33        try {
34           Class c = this.loadClass(name, true);
35           return c.newInstance();
36        } catch (Exception e) {
37           e.printStackTrace();
38        }
39        return null;
40     }
41     
42     /***
43      * Load a class by name.
44      * @see java.lang.ClassLoader#loadClass()
45      */
46     protected Class loadClass(String name, boolean resolve) 
47                             throws ClassNotFoundException {
48        Class c = findLoadedClass(name);
49        if (c == null) {
50           try {
51              c = findSystemClass(name);
52           } catch (Exception e) {}
53        }
54        if (c == null) {
55           try {
56              byte data[] = loadClassData(name);
57              if (data != null) {
58                 c = defineClass(name, data, 0, data.length);
59              }
60              if (c == null) {
61                 throw new ClassNotFoundException(name);
62              }
63           } catch (IOException e) {
64              throw new ClassNotFoundException("Error reading class: " + name);
65           }
66        }
67        if (resolve) {
68           resolveClass(c);
69        }
70        return c;
71     }
72  
73     private byte[] loadClassData(String filename) throws IOException {
74        if (archive == null) return null;
75        filename = filename.replaceAll("//.", "/");
76        return loadResource(filename + ".class");
77     }  
78  
79     private byte[] loadResource(String name) {
80        try {
81           ZipEntry ze = archive.getEntry(name);
82           if (ze == null) {          
83              return null;
84           }
85           InputStream in = archive.getInputStream(ze);
86           int size = (int)ze.getSize();
87           byte buff[] = new byte[size];
88           BufferedInputStream bis = new BufferedInputStream(in);
89           DataInputStream dis = new DataInputStream(bis);
90           
91           int n = 0;
92           try {
93              while (true) {
94                 buff[n++] = (byte)dis.readByte();
95              }
96           } catch (EOFException eof) {}
97           n--;
98           dis.close();         
99           return buff;
100       } catch (Exception e) {
101          e.printStackTrace();
102       }
103       return null;
104    }
105    
106    public ImageIcon loadImageIcon(String name) {
107       byte buff[] = loadResource(name);
108       if (buff != null) {     
109          return new ImageIcon(buff);
110       } else {
111          return null;
112       }     
113    }
114    
115 }