Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

bsh
Class BshClassManager  view BshClassManager download BshClassManager.java

java.lang.Object
  extended bybsh.BshClassManager

public class BshClassManager
extends java.lang.Object

BshClassManager manages all classloading in BeanShell. It also supports a dynamically loaded extension (bsh.classpath package) which allows classpath extension and class file reloading. Currently the extension relies on 1.2 for BshClassLoader and weak references. See http://www.beanshell.org/manual/classloading.html for details on the bsh classloader architecture.

Bsh has a multi-tiered class loading architecture. No class loader is used unless/until the classpath is modified or a class is reloaded.


Nested Class Summary
static interface BshClassManager.Listener
           
(package private) static class BshClassManager.SignatureKey
          SignatureKey serves as a hash of a method signature on a class for fast lookup of overloaded and general resolved Java methods.
 
Field Summary
protected  java.util.Hashtable absoluteClassCache
          Global cache for things we know are classes.
protected  java.util.Hashtable absoluteNonClasses
          Global cache for things we know are *not* classes.
private  java.lang.ClassLoader externalClassLoader
          An external classloader supplied by the setClassLoader() command.
private static java.lang.Object NOVALUE
          Identifier for no value item.
protected  java.util.Hashtable resolvedObjectMethods
          Caches for resolved object and static methods.
protected  java.util.Hashtable resolvedStaticMethods
           
 
Constructor Summary
BshClassManager()
           
 
Method Summary
 void addClassPath(java.net.URL path)
           
 void addListener(BshClassManager.Listener l)
           
 void cacheClassInfo(java.lang.String name, java.lang.Class value)
          Cache info about whether name is a class or not.
 void cacheResolvedMethod(java.lang.Class clas, java.lang.Object[] args, java.lang.reflect.Method method)
          Cache a resolved (possibly overloaded) method based on the argument types used to invoke it, subject to classloader change.
 boolean classExists(java.lang.String name)
           
 java.lang.Class classForName(java.lang.String name)
          Load the specified class by name, taking into account added classpath and reloaded classes, etc.
protected  void classLoaderChanged()
           
protected  void clearCaches()
          Clear the caches in BshClassManager
protected static UtilEvalError cmUnavailable()
           
static BshClassManager createClassManager()
          Create a new instance of the class manager.
protected  void doSuperImport()
          Support for "import *;" Hide details in here as opposed to NameSpace.
 void dump(java.io.PrintWriter pw)
           
protected  java.lang.String getClassNameByUnqName(java.lang.String name)
          Return the name or null if none is found, Throw an ClassPathException containing detail if name is ambigous.
 java.lang.reflect.Method getResolvedMethod(java.lang.Class clas, java.lang.String methodName, java.lang.Object[] args, boolean onlyStatic)
          Return a previously cached resolved method.
 java.net.URL getResource(java.lang.String path)
          Get a resource URL using the BeanShell classpath
 java.io.InputStream getResourceAsStream(java.lang.String path)
          Get a resource stream using the BeanShell classpath
protected  boolean hasSuperImport()
          A "super import" ("import *") operation has been performed.
protected static java.lang.Error noClassDefFound(java.lang.String className, java.lang.Error e)
          Annotate the NoClassDefFoundError with some info about the class we were trying to load.
 java.lang.Class plainClassForName(java.lang.String name)
          Perform a plain Class.forName() or call the externally provided classloader.
 void reloadAllClasses()
          Overlay the entire path with a new class loader.
 void reloadClasses(java.lang.String[] classNames)
          Reloading classes means creating a new classloader and using it whenever we are asked for classes in the appropriate space.
 void reloadPackage(java.lang.String pack)
          Reload all classes in the specified package: e.g.
 void removeListener(BshClassManager.Listener l)
           
 void reset()
          Clear all loaders and start over.
 void setClassLoader(java.lang.ClassLoader externalCL)
          Set an external class loader.
 void setClassPath(java.net.URL[] cp)
          Set a new base classpath and create a new base classloader.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

NOVALUE

private static java.lang.Object NOVALUE
Identifier for no value item. Use a hashtable as a Set.


externalClassLoader

private java.lang.ClassLoader externalClassLoader
An external classloader supplied by the setClassLoader() command.


absoluteClassCache

protected transient java.util.Hashtable absoluteClassCache
Global cache for things we know are classes. Note: these should probably be re-implemented with Soft references. (as opposed to strong or Weak)


absoluteNonClasses

protected transient java.util.Hashtable absoluteNonClasses
Global cache for things we know are *not* classes. Note: these should probably be re-implemented with Soft references. (as opposed to strong or Weak)


resolvedObjectMethods

protected transient java.util.Hashtable resolvedObjectMethods
Caches for resolved object and static methods. We keep these maps separate to support fast lookup in the general case where the method may be either.


resolvedStaticMethods

protected transient java.util.Hashtable resolvedStaticMethods
Constructor Detail

BshClassManager

public BshClassManager()
Method Detail

createClassManager

public static BshClassManager createClassManager()
Create a new instance of the class manager. Class manager instnaces are now associated with the interpreter.


classExists

public boolean classExists(java.lang.String name)

classForName

public java.lang.Class classForName(java.lang.String name)
Load the specified class by name, taking into account added classpath and reloaded classes, etc.


plainClassForName

public java.lang.Class plainClassForName(java.lang.String name)
                                  throws java.lang.ClassNotFoundException
Perform a plain Class.forName() or call the externally provided classloader. If a BshClassManager implementation is loaded the call will be delegated to it, to allow for additional hooks.

This simply wraps that bottom level class lookup call and provides a central point for monitoring and handling certain Java version dependent bugs, etc.


getResource

public java.net.URL getResource(java.lang.String path)
Get a resource URL using the BeanShell classpath


getResourceAsStream

public java.io.InputStream getResourceAsStream(java.lang.String path)
Get a resource stream using the BeanShell classpath


cacheClassInfo

public void cacheClassInfo(java.lang.String name,
                           java.lang.Class value)
Cache info about whether name is a class or not.


cacheResolvedMethod

public void cacheResolvedMethod(java.lang.Class clas,
                                java.lang.Object[] args,
                                java.lang.reflect.Method method)
Cache a resolved (possibly overloaded) method based on the argument types used to invoke it, subject to classloader change. Static and Object methods are cached separately to support fast lookup in the general case where either will do.


getResolvedMethod

public java.lang.reflect.Method getResolvedMethod(java.lang.Class clas,
                                                  java.lang.String methodName,
                                                  java.lang.Object[] args,
                                                  boolean onlyStatic)
Return a previously cached resolved method.


clearCaches

protected void clearCaches()
Clear the caches in BshClassManager


setClassLoader

public void setClassLoader(java.lang.ClassLoader externalCL)
Set an external class loader. BeanShell will use this at the same point it would otherwise use the plain Class.forName(). i.e. if no explicit classpath management is done from the script (addClassPath(), setClassPath(), reloadClasses()) then BeanShell will only use the supplied classloader. If additional classpath management is done then BeanShell will perform that in addition to the supplied external classloader. However BeanShell is not currently able to reload classes supplied through the external classloader.


addClassPath

public void addClassPath(java.net.URL path)
                  throws java.io.IOException

reset

public void reset()
Clear all loaders and start over. No class loading.


setClassPath

public void setClassPath(java.net.URL[] cp)
                  throws UtilEvalError
Set a new base classpath and create a new base classloader. This means all types change.


reloadAllClasses

public void reloadAllClasses()
                      throws UtilEvalError
Overlay the entire path with a new class loader. Set the base path to the user path + base path. No point in including the boot class path (can't reload thos).


reloadClasses

public void reloadClasses(java.lang.String[] classNames)
                   throws UtilEvalError
Reloading classes means creating a new classloader and using it whenever we are asked for classes in the appropriate space. For this we use a DiscreteFilesClassLoader


reloadPackage

public void reloadPackage(java.lang.String pack)
                   throws UtilEvalError
Reload all classes in the specified package: e.g. "com.sun.tools" The special package name "" can be used to refer to unpackaged classes.


doSuperImport

protected void doSuperImport()
                      throws UtilEvalError
Support for "import *;" Hide details in here as opposed to NameSpace.


hasSuperImport

protected boolean hasSuperImport()
A "super import" ("import *") operation has been performed.


getClassNameByUnqName

protected java.lang.String getClassNameByUnqName(java.lang.String name)
                                          throws UtilEvalError
Return the name or null if none is found, Throw an ClassPathException containing detail if name is ambigous.


addListener

public void addListener(BshClassManager.Listener l)

removeListener

public void removeListener(BshClassManager.Listener l)

dump

public void dump(java.io.PrintWriter pw)

classLoaderChanged

protected void classLoaderChanged()

noClassDefFound

protected static java.lang.Error noClassDefFound(java.lang.String className,
                                                 java.lang.Error e)
Annotate the NoClassDefFoundError with some info about the class we were trying to load.


cmUnavailable

protected static UtilEvalError cmUnavailable()