Top Description Fields Constructors Methods
org.apache.bcel.util

public Class ClassLoader

extends ClassLoader
Class Inheritance
Annotations
@Deprecated
Imports
java.io.ByteArrayInputStream, .IOException, java.util.Hashtable, org.apache.bcel.Const, org.apache.bcel.classfile.ClassParser, .ConstantClass, .ConstantPool, .ConstantUtf8, .JavaClass, .Utility

Deprecated

6.0 Do not use - does not work

Drop in replacement for the standard class loader of the JVM. You can use it in conjunction with the JavaWrapper to dynamically modify/create classes as they're requested.

This class loader recognizes special requests in a distinct format, i.e., when the name of the requested class contains with "$$BCEL$$" it calls the createClass() method with that name (everything bevor the $$BCEL$$ is considered to be the package name. You can subclass the class loader and override that method. "Normal" classes class can be modified by overriding the modifyClass() method which is called just before defineClass().

There may be a number of packages where you have to use the default class loader (which may also be faster). You can define the set of packages where to use the system class loader in the constructor. The default value contains "java.", "sun.", "javax."

See Also
JavaWrapper, ClassPath

Field Summary

Modifier and TypeField and Description
private static final String
private final Hashtable<String, Class<?>>
public static final String[]
private final String[]
private Repository

Constructor Summary

AccessConstructor and Description
public
ClassLoader()

Ignored packages are by default ( "java.", "sun.", "javax."), i.e. loaded by system class loader

public
ClassLoader(final ClassLoader
delegate class loader to use for ignored packages
deferTo
)

public
ClassLoader(final ClassLoader
delegate class loader to use for ignored packages
deferTo
,
final String[]
classes contained in these packages will be loaded with the system class loader
ignoredPackages
)

public
ClassLoader(final String[]
classes contained in these packages will be loaded with the system class loader
ignoredPackages
)

Method Summary

Modifier and TypeMethod and Description
protected JavaClass
createClass(final String
compressed byte code with "$$BCEL$$" in it
className
)

Override this method to create you own classes on the fly.

protected Class<?>
loadClass(final String
The binary name of the class
className
,
final boolean
If true then resolve the class
resolve
)

Overrides java.lang.ClassLoader.loadClass.

Loads the class with the specified binary name.
protected JavaClass
modifyClass(final JavaClass clazz)

Override this method if you want to alter a class before it gets actually loaded.

Inherited from java.lang.ClassLoader:
clearAssertionStatusdefineClassdefineClassdefineClassdefineClassdefinePackagefindClassfindClassfindLibraryfindLoadedClassfindResourcefindResourcefindResourcesfindSystemClassgetClassLoadingLockgetDefinedPackagegetDefinedPackagesgetNamegetPackagegetPackagesgetParentgetPlatformClassLoadergetResourcegetResourceAsStreamgetResourcesgetSystemClassLoadergetSystemResourcegetSystemResourceAsStreamgetSystemResourcesgetUnnamedModuleisRegisteredAsParallelCapableloadClassregisterAsParallelCapableresolveClassresourcessetClassAssertionStatussetDefaultAssertionStatussetPackageAssertionStatussetSigners

Field Detail

BCEL_TOKENback to summary
private static final String BCEL_TOKEN
classesback to summary
private final Hashtable<String, Class<?>> classes

Hides java.lang.ClassLoader.classes.

DEFAULT_IGNORED_PACKAGESback to summary
public static final String[] DEFAULT_IGNORED_PACKAGES
ignoredPackagesback to summary
private final String[] ignoredPackages
repositoryback to summary
private Repository repository

Constructor Detail

ClassLoaderback to summary
public ClassLoader()

Ignored packages are by default ( "java.", "sun.", "javax."), i.e. loaded by system class loader

ClassLoaderback to summary
public ClassLoader(final ClassLoader deferTo)
Parameters
deferTo:ClassLoader

delegate class loader to use for ignored packages

ClassLoaderback to summary
public ClassLoader(final ClassLoader deferTo, final String[] ignoredPackages)
Parameters
deferTo:ClassLoader

delegate class loader to use for ignored packages

ignoredPackages:String[]

classes contained in these packages will be loaded with the system class loader

ClassLoaderback to summary
public ClassLoader(final String[] ignoredPackages)
Parameters
ignoredPackages:String[]

classes contained in these packages will be loaded with the system class loader

Method Detail

createClassback to summary
protected JavaClass createClass(final String className)

Override this method to create you own classes on the fly. The name contains the special token $$BCEL$$. Everything before that token is considered to be a package name. You can encode your own arguments into the subsequent string. You must ensure however not to use any "illegal" characters, i.e., characters that may not appear in a Java class name too

The default implementation interprets the string as a encoded compressed Java class, unpacks and decodes it with the Utility.decode() method, and parses the resulting byte array and returns the resulting JavaClass object.

Parameters
className:String

compressed byte code with "$$BCEL$$" in it

loadClassback to summary
protected Class<?> loadClass(final String className, final boolean resolve) throws ClassNotFoundException

Overrides java.lang.ClassLoader.loadClass.

Doc from java.lang.ClassLoader.loadClass.

Loads the class with the specified binary name. The default implementation of this method searches for classes in the following order:

  1. Invoke findLoadedClass(String) to check if the class has already been loaded.

  2. Invoke the loadClass method on the parent class loader. If the parent is null the class loader built into the virtual machine is used, instead.

  3. Invoke the findClass(String) method to find the class.

If the class was found using the above steps, and the resolve flag is true, this method will then invoke the resolveClass(Class) method on the resulting Class object.

Subclasses of ClassLoader are encouraged to override findClass(String), rather than this method.

Unless overridden, this method synchronizes on the result of getClassLoadingLock method during the entire class loading process.

Parameters
className:String

The binary name of the class

resolve:boolean

If true then resolve the class

Returns:Class<?>

The resulting Class object

Annotations
@Override
Exceptions
ClassNotFoundException:
If the class could not be found
modifyClassback to summary
protected JavaClass modifyClass(final JavaClass clazz)

Override this method if you want to alter a class before it gets actually loaded. Does nothing by default.