home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / java / lang / classloader.java < prev    next >
Text File  |  1995-08-11  |  5KB  |  137 lines

  1. /*
  2.  * @(#)ClassLoader.java    1.14 95/02/21 Arthur van Hoff
  3.  *
  4.  * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software
  7.  * and its documentation for NON-COMMERCIAL purposes and without
  8.  * fee is hereby granted provided that this copyright notice
  9.  * appears in all copies. Please refer to the file "copyright.html"
  10.  * for further important copyright and licensing information.
  11.  *
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  13.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  14.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  15.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  16.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  17.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  18.  */
  19.  
  20. package java.lang;
  21.  
  22. import java.io.InputStream;
  23.  
  24. /**
  25.  * ClassLoader is an abstract class that can be used to define a policy
  26.  * for loading Java classes into the runtime environment. By default,
  27.  * the runtime system  loads classes that originate as files by reading 
  28.  * them from the directory defined by the <tt>CLASSPATH</tt> environment
  29.  * variable (this is platform dependent). The default mechanism does not involve
  30.  * a class loader. <p>
  31.  *
  32.  * However, some classes may not originate from a file; they could be
  33.  * loaded from some other source, e.g., the network. Classes loaded
  34.  * from the network are an array of bytes. A ClassLoader can be used to
  35.  * tell the runtime system to convert an array of bytes into an instance
  36.  * of class Class.
  37.  * This conversion information is passed to the runtime using the defineClass()
  38.  * method.<p>
  39.  *
  40.  * Classes that are created through the defineClass() mechanism can 
  41.  * reference other classes by name. To resolve those names the runtime
  42.  * system calls to the ClassLoader that originally created the class.
  43.  * The runtime system calls the abstract method loadClass() to load
  44.  * the referenced classes.<p>
  45.  * <pre>
  46.  *     ClassLoader loader = new NetworkClassLoader(host, port);
  47.  *      Object main = loader.loadClass("Main").newInstance();
  48.  *    ....
  49.  * </pre>
  50.  *
  51.  * The NetworkClassLoader subclass must define the method loadClass() to 
  52.  * load a class from the network. Once it has downloaded the bytes
  53.  * that make up the class it should use definedClass to create a class
  54.  * instance. A sample implementation could be:
  55.  * <pre>
  56.  *    class NetworkClassLoader {
  57.  *        String host;
  58.  *        int port;
  59.  *        Hashtable cache = new Hashtable();
  60.  *
  61.  *        private byte loadClassData(String name)[] {
  62.  *        // load the class data from the connection
  63.  *        ...
  64.  *        }
  65.  *
  66.  *        public synchronized Class loadClass(String name) {
  67.  *            Class c = cache.get(name);
  68.  *        if (c == null) {
  69.  *            byte data[] = loadClassData(name);
  70.  *            cache.put(name, defineClass(data, 0, data.length));
  71.  *        }
  72.  *        return c;
  73.  *        }
  74.  *    }
  75.  * </pre>
  76.  * @see        Class
  77.  * @version     1.14, 21 Feb 1995
  78.  * @author    Arthur van Hoff
  79.  */
  80.  
  81.  
  82. public
  83. class ClassLoader {
  84.     /**
  85.      * Constructs a new class loader and initializes it.
  86.      */
  87.     protected ClassLoader() {
  88.     init();
  89.     }
  90.  
  91.     /**
  92.      * Resolves the specified name to a class. loadClass() is called by the 
  93.      * interpreter.
  94.      * As an abstract method, loadClass() must be defined in a subclass of 
  95.      * ClassLoader. Using a Hashtable avoids loading the same class more than
  96.      * once. It is an abstract method, it must therefore be defined in a subclass.
  97.      * @param    name    the name of the desired class
  98.      * @param   resolve true if the class needs to be resolved
  99.      * @return        the resulting class, or null if it was not found
  100.      * @see        java.util.Hashtable
  101.      */
  102.     protected abstract Class loadClass(String name, boolean resolve);
  103.  
  104.     /**
  105.      * Converts an array of bytes to an instance of class Class. Before the
  106.      * class can be used it must be resolved.
  107.      * @param    data    the bytes that make up the class
  108.      * @param    offset    the start ofset of the class data
  109.      * @param    length    the length of the class data
  110.      * @return        the class object which was created from the data
  111.      * @exception FileFormatException the data does not contain a valid class
  112.      * @see         ClassLoader#loadClass
  113.      * @see         ClassLoader#resolveClass
  114.      */
  115.     protected native final Class defineClass(byte data[], int offset, int length);
  116.  
  117.     /**
  118.      * Resolves classes referenced by this class. This must be done before the
  119.      * class can be used. Class names referenced by the resulting class are
  120.      * resolved by calling loadClass().
  121.      * @param    c    the class to be resolved
  122.      * @see         ClassLoader#defineClass
  123.      */
  124.     protected native final void resolveClass(Class c);
  125.  
  126.     /**
  127.      * Returns the classes that are currently on the execution stack.
  128.      * This is a hack and will probably not be supported in the future.
  129.      */
  130.     public static native Class getClassContext()[];
  131.  
  132.     /**
  133.      * Initializes the class loader.
  134.      */
  135.     private native void init();
  136. }
  137.