FileDocCategorySizeDatePackage
ClassLoaderDemo1.javaAPI DocExample5025Wed Mar 14 21:06:02 GMT 2001None

ClassLoaderDemo1

public class ClassLoaderDemo1 extends ClassLoader
Demonstration of a ClassLoader

Fields Summary
protected Hashtable
cache
The Hashtable to keep track of classes, to avoid re-loading them
private final int
dataLength
data's expected length
private int[]
data
data, obtained by dumping a compiled .class file
Constructors Summary
Methods Summary
private byte[]genClassData(java.lang.String name)
"load", that is, make up, the data for the class


	           
	    
		if (dataLength != data.length)
			throw new IllegalArgumentException("data corrupt");
		byte[] bd = new byte[data.length];
		for (int i=0; i<bd.length; i++)
			bd[i] = (byte)data[i];
		return bd;
	
public synchronized java.lang.ClassloadClass(java.lang.String name, boolean resolve)

 
		/** We can expect to be called to resolve at least demo's
		 * superclass (java.lang.Object). Fortunatetely, we can just
		 * use super.findSystemClass() to load such things...
		 */
		if (name.startsWith("java.")) {
			System.out.println("loadClass: SystemLoading " + name);
			return findSystemClass(name);
		}
		Class c = (Class)cache.get(name);
		if (c == null) {
			System.out.println("loadClass: About to genClassData " + name);
			byte mydata[] = genClassData(name);
			System.out.println("loadClass: About to defineClass " + name);
			c = defineClass(name, mydata, 0, mydata.length);
			System.out.println("loadClass: storing " + name + " in cache.");
			cache.put(name, c);
		} else
			System.out.println("loadClass: found " + name + " in cache.");
		if (resolve) {
			System.out.println("loadClass: About to resolveClass " + name);
			resolveClass(c);
		}
		return c;
	
public static voidmain(java.lang.String[] argv)

		System.out.println("ClassLoaderDemo1 starting");
		ClassLoaderDemo1 loader = new ClassLoaderDemo1();
		Class c = null;
		Object demo;
		try {
			/* Load the "Demo" class from memory */

			System.out.println("About to load class  Demo");
			c = loader.loadClass("Demo", true);
			System.out.println("About to instantiate class Demo");
			demo = c.newInstance();
			System.out.println("Got Demo class loaded: " + demo);

			/* Now try to call a method */

			Method mi = c.getMethod("test", null);
			mi.invoke(demo, null);

		} catch (InvocationTargetException e) {
			// The invoked method threw an exception. We get it
			// wrapped up inside another exception, hence the
			// extra call here:
			e.getTargetException().printStackTrace();
			System.out.println("Could not run test method");
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Could not run test method");
		}

		/** Try to load some arbitrary class, to see if our
		 * ClassLoader gets called.
		 */
		System.out.println("Trying to load an unrelated class");
		java.awt.image.DirectColorModel jnk = new java.awt.image.DirectColorModel(24,8,8,8);
		System.out.println("Load an unrelated class - was your ClassLoader called?");

		/** Try to instantiate a second ClassLoader */
		System.out.println("Trying to install another ClassLoader");
		ClassLoaderDemo1 loader2 = new ClassLoaderDemo1();
		System.out.println("Instantiated another ClassLoader...");