Add to classpath in runtime
Two known facts first. Classpath is defined on JVM startup, before application starts. Second, when some class has to be loaded dynamically, default system class loader will search for it on this classpath.
However, sometimes it would be nice to be possible to extend the classpath in the runtime. Once when classpath is extended, then it would be possible to dynamically load classes from added folders/JARs, in the absolutely same way as when the classpath is defined during the JVM startup. Unfortunately, Java doesn't allow classpath to be changed (extended) in the runtime.
But Jodd provides a hack for that. Using ClassLoaderUtil
methods
addFileToClassPath()
and addUrlToClassPath()
it is possible to
extend classpath in runtime, by adding files or URLs of new
folders/JARs. Simply as that:
String addonClasspath = "/some/path/not/already/on/classpath"; ClassLoaderUtil.addFileToClassPath(addonClasspath); Class c = Class.forName("FooClass"); // load class anyhow Object o = c.newInstance(); // start using it...
While adding is possible, it is not possible to remove items from the classpath.
Defining classes in the runtime
Instead of adding a classpath and then loading new classes from it,
Jodd is possible to define classes in the run time, just from
their file content. The procedure is simple: read class file from file
system into byte array that is to be provided to defineClass()
.
Previous example may be written as:
String classPath = "/some/path/to/class/file/not/on/classpath/Foo.class"; byte[] classBytes = FileUtil.readBytes(classPath); Class c = ClassLoaderUtil.defineClass("FooClass", classBytes); Object o = c.newInstance(); // start using it...
Again, this is a Jodd hack and not something Java allows.
Comparison
What is the difference between these two approaches? The first one really extends the classpath, so all classes on the added path implicitly becomes visible. Second approach does not extend the classpath, but adds each class manually. It requires more work if more classes are needed, and order of class defining is important (because of dependencies). However, class can be read from any source (file system, network,…) and can be in any format (encrypted, zipped…).
Hack alert!
Both methods are hacks. Although they should (and will) work, user must be aware that the results may be different then expected.