Package org.gjt.sp.jedit.bsh.classpath
Class ClassManagerImpl
- java.lang.Object
-
- org.gjt.sp.jedit.bsh.BshClassManager
-
- org.gjt.sp.jedit.bsh.classpath.ClassManagerImpl
-
public class ClassManagerImpl extends BshClassManager
Manage all classloading in BeanShell. Allows classpath extension and class file reloading. This class holds the implementation of the BshClassManager so that it can be separated from the core package. This class currently relies on 1.2 for BshClassLoader and weak references. Is there a workaround for weak refs? If so we could make this work with 1.1 by supplying our own classloader code... 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 created unless/until a class is generated, the classpath is modified, or a class is reloaded. Note: we may need some synchronization in here Note on jdk1.2 dependency: We are forced to use weak references here to accomodate all of the fleeting namespace listeners. (NameSpaces must be informed if the class space changes so that they can un-cache names). I had the interesting thought that a way around this would be to implement BeanShell's own garbage collector... Then I came to my senses and said - screw it, class re-loading will require 1.2. --------------------- Classloading precedence: in-script evaluated class (scripted class) in-script added / modified classpath optionally, external classloader optionally, thread context classloader plain Class.forName() source class (.java file in classpath)
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class org.gjt.sp.jedit.bsh.BshClassManager
BshClassManager.Listener
-
-
Field Summary
-
Fields inherited from class org.gjt.sp.jedit.bsh.BshClassManager
absoluteClassCache, absoluteNonClasses, definingClasses, definingClassesBaseNames, externalClassLoader, resolvedObjectMethods, resolvedStaticMethods
-
-
Constructor Summary
Constructors Constructor Description ClassManagerImpl()Used by BshClassManager singleton constructor
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidaddClassPath(java.net.URL path)voidaddListener(BshClassManager.Listener l)java.lang.ClassclassForName(java.lang.String name)Load the specified class by name, taking into account added classpath and reloaded classes, etc.protected voidclassLoaderChanged()Clear global class cache and notify namespaces to clear their class caches.java.lang.ClassdefineClass(java.lang.String name, byte[] code)Get the BeanShell classloader.voiddoSuperImport()Support for "import *;" Hide details in here as opposed to NameSpace.voiddump(java.io.PrintWriter i)java.lang.ClassLoadergetBaseLoader()java.lang.StringgetClassNameByUnqName(java.lang.String name)Return the name or null if none is found, Throw an ClassPathException containing detail if name is ambigous.BshClassPathgetClassPath()Get the full blown classpath.java.net.URLgetResource(java.lang.String path)Get a resource URL using the BeanShell classpathjava.io.InputStreamgetResourceAsStream(java.lang.String path)Get a resource stream using the BeanShell classpathprotected booleanhasSuperImport()A "super import" ("import *") operation has been performed.voidreloadAllClasses()Overlay the entire path with a new class loader.voidreloadClasses(java.lang.String[] classNames)Reloading classes means creating a new classloader and using it whenever we are asked for classes in the appropriate space.voidreloadPackage(java.lang.String pack)Reload all classes in the specified package: e.g.voidremoveListener(BshClassManager.Listener l)voidreset()Clear all classloading behavior and class caches and reset to initial state.voidsetClassPath(java.net.URL[] cp)Set a new base classpath and create a new base classloader.-
Methods inherited from class org.gjt.sp.jedit.bsh.BshClassManager
cacheClassInfo, cacheResolvedMethod, classExists, clearCaches, cmUnavailable, createClassManager, definingClass, doneDefiningClass, getClassBeingDefined, getResolvedMethod, isClassBeingDefined, loadSourceClass, noClassDefFound, plainClassForName, setClassLoader
-
-
-
-
Method Detail
-
classForName
public java.lang.Class classForName(java.lang.String name)
Description copied from class:BshClassManagerLoad the specified class by name, taking into account added classpath and reloaded classes, etc. Note: Again, this is just a trivial implementation. See bsh.classpath.ClassManagerImpl for the fully functional class management package.- Overrides:
classForNamein classBshClassManager- Returns:
- the class or null
-
getResource
public java.net.URL getResource(java.lang.String path)
Get a resource URL using the BeanShell classpath- Overrides:
getResourcein classBshClassManager- Parameters:
path- should be an absolute path
-
getResourceAsStream
public java.io.InputStream getResourceAsStream(java.lang.String path)
Get a resource stream using the BeanShell classpath- Overrides:
getResourceAsStreamin classBshClassManager- Parameters:
path- should be an absolute path
-
addClassPath
public void addClassPath(java.net.URL path) throws java.io.IOException- Overrides:
addClassPathin classBshClassManager- Throws:
java.io.IOException
-
reset
public void reset()
Clear all classloading behavior and class caches and reset to initial state.- Overrides:
resetin classBshClassManager
-
setClassPath
public void setClassPath(java.net.URL[] cp)
Set a new base classpath and create a new base classloader. This means all types change.- Overrides:
setClassPathin classBshClassManager
-
reloadAllClasses
public void reloadAllClasses() throws ClassPathExceptionOverlay 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).- Overrides:
reloadAllClassesin classBshClassManager- Throws:
ClassPathException
-
reloadClasses
public void reloadClasses(java.lang.String[] classNames) throws ClassPathExceptionReloading 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- Overrides:
reloadClassesin classBshClassManager- Throws:
ClassPathException
-
reloadPackage
public void reloadPackage(java.lang.String pack) throws ClassPathExceptionReload all classes in the specified package: e.g. "com.sun.tools" The special package name "<unpackaged>" can be used to refer to unpackaged classes.- Overrides:
reloadPackagein classBshClassManager- Throws:
ClassPathException
-
getClassPath
public BshClassPath getClassPath() throws ClassPathException
Get the full blown classpath.- Throws:
ClassPathException
-
doSuperImport
public void doSuperImport() throws UtilEvalErrorSupport for "import *;" Hide details in here as opposed to NameSpace.- Overrides:
doSuperImportin classBshClassManager- Throws:
UtilEvalError
-
hasSuperImport
protected boolean hasSuperImport()
Description copied from class:BshClassManagerA "super import" ("import *") operation has been performed.- Overrides:
hasSuperImportin classBshClassManager
-
getClassNameByUnqName
public java.lang.String getClassNameByUnqName(java.lang.String name) throws ClassPathExceptionReturn the name or null if none is found, Throw an ClassPathException containing detail if name is ambigous.- Overrides:
getClassNameByUnqNamein classBshClassManager- Throws:
ClassPathException
-
addListener
public void addListener(BshClassManager.Listener l)
- Overrides:
addListenerin classBshClassManager
-
removeListener
public void removeListener(BshClassManager.Listener l)
- Overrides:
removeListenerin classBshClassManager
-
getBaseLoader
public java.lang.ClassLoader getBaseLoader()
-
defineClass
public java.lang.Class defineClass(java.lang.String name, byte[] code)Get the BeanShell classloader. public ClassLoader getClassLoader() { }- Overrides:
defineClassin classBshClassManager
-
classLoaderChanged
protected void classLoaderChanged()
Clear global class cache and notify namespaces to clear their class caches. The listener list is implemented with weak references so that we will not keep every namespace in existence forever.- Overrides:
classLoaderChangedin classBshClassManager
-
dump
public void dump(java.io.PrintWriter i)
- Overrides:
dumpin classBshClassManager
-
-