org.apache.bcel.util

Class ClassLoader

public class ClassLoader extends ClassLoader

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."

Version: $Id: ClassLoader.java 152804 2002-06-13 09:32:50Z enver $

Author: M. Dahm

See Also: JavaWrapper ClassPath

Constructor Summary
ClassLoader()
ClassLoader(ClassLoader deferTo)
ClassLoader(String[] ignored_packages)
ClassLoader(ClassLoader deferTo, String[] ignored_packages)
Method Summary
protected JavaClasscreateClass(String class_name)
Override this method to create you own classes on the fly.
protected ClassloadClass(String class_name, boolean resolve)
protected JavaClassmodifyClass(JavaClass clazz)
Override this method if you want to alter a class before it gets actually loaded.

Constructor Detail

ClassLoader

public ClassLoader()

ClassLoader

public ClassLoader(ClassLoader deferTo)

ClassLoader

public ClassLoader(String[] ignored_packages)

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

ClassLoader

public ClassLoader(ClassLoader deferTo, String[] ignored_packages)

Method Detail

createClass

protected JavaClass createClass(String class_name)
Override this method to create you own classes on the fly. The name contains the special token $$BCEL$$. Everything before that token is consddered to be a package name. You can encode you own arguments into the subsequent string. You must regard 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: class_name compressed byte code with "$$BCEL$$" in it

loadClass

protected Class loadClass(String class_name, boolean resolve)

modifyClass

protected JavaClass modifyClass(JavaClass clazz)
Override this method if you want to alter a class before it gets actually loaded. Does nothing by default.