|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object bsh.BshClassManager
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
|
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. |
protected java.util.Hashtable |
definingClasses
|
protected java.util.Hashtable |
definingClassesBaseNames
|
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.Class[] types,
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(Interpreter interpreter)
Create a new instance of the class manager. |
java.lang.Class |
defineClass(java.lang.String name,
byte[] code)
|
protected void |
definingClass(java.lang.String className)
Flag the class name as being in the process of being defined. |
protected void |
doneDefiningClass(java.lang.String className)
Indicate that the specified class name has been defined and may be loaded normally. |
protected void |
doSuperImport()
Support for "import *;" Hide details in here as opposed to NameSpace. |
void |
dump(java.io.PrintWriter pw)
|
protected java.lang.String |
getClassBeingDefined(java.lang.String className)
This method is a temporary workaround used with definingClass. |
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. |
protected java.lang.reflect.Method |
getResolvedMethod(java.lang.Class clas,
java.lang.String methodName,
java.lang.Class[] types,
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 boolean |
isClassBeingDefined(java.lang.String className)
|
protected java.lang.Class |
loadSourceClass(java.lang.String name)
|
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 |
protected transient java.util.Hashtable absoluteClassCache
protected transient java.util.Hashtable absoluteNonClasses
protected transient java.util.Hashtable resolvedObjectMethods
protected transient java.util.Hashtable resolvedStaticMethods
protected transient java.util.Hashtable definingClasses
protected transient java.util.Hashtable definingClassesBaseNames
Constructor Detail |
public BshClassManager()
Method Detail |
public static BshClassManager createClassManager(Interpreter interpreter)
bsh.Interpreter.getClassManager()
,
bsh.Interpreter.setClassLoader( ClassLoader )
public boolean classExists(java.lang.String name)
public java.lang.Class classForName(java.lang.String name)
protected java.lang.Class loadSourceClass(java.lang.String name)
public java.lang.Class plainClassForName(java.lang.String name) throws java.lang.ClassNotFoundException
java.lang.ClassNotFoundException
classForName( String )
public java.net.URL getResource(java.lang.String path)
path
- should be an absolute pathpublic java.io.InputStream getResourceAsStream(java.lang.String path)
path
- should be an absolute pathpublic void cacheClassInfo(java.lang.String name, java.lang.Class value)
value
- if value is non-null, cache the class
if value is null, set the flag that it is *not* a class to
speed later resolutionpublic void cacheResolvedMethod(java.lang.Class clas, java.lang.Class[] types, java.lang.reflect.Method method)
protected java.lang.reflect.Method getResolvedMethod(java.lang.Class clas, java.lang.String methodName, java.lang.Class[] types, boolean onlyStatic)
onlyStatic
- specifies that only a static method may be returned.
protected void clearCaches()
void #reset() for external usage
public void setClassLoader(java.lang.ClassLoader externalCL)
public void addClassPath(java.net.URL path) throws java.io.IOException
java.io.IOException
public void reset()
public void setClassPath(java.net.URL[] cp) throws UtilEvalError
UtilEvalError
public void reloadAllClasses() throws UtilEvalError
UtilEvalError
public void reloadClasses(java.lang.String[] classNames) throws UtilEvalError
UtilEvalError
public void reloadPackage(java.lang.String pack) throws UtilEvalError
UtilEvalError
protected void doSuperImport() throws UtilEvalError
UtilEvalError
protected boolean hasSuperImport()
protected java.lang.String getClassNameByUnqName(java.lang.String name) throws UtilEvalError
UtilEvalError
public void addListener(BshClassManager.Listener l)
public void removeListener(BshClassManager.Listener l)
public void dump(java.io.PrintWriter pw)
protected void definingClass(java.lang.String className)
protected boolean isClassBeingDefined(java.lang.String className)
protected java.lang.String getClassBeingDefined(java.lang.String className)
protected void doneDefiningClass(java.lang.String className)
public java.lang.Class defineClass(java.lang.String name, byte[] code)
protected void classLoaderChanged()
protected static java.lang.Error noClassDefFound(java.lang.String className, java.lang.Error e)
protected static UtilEvalError cmUnavailable()
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |