The loading of a class (actually of any reference type) and all its ancestors occurs automatically before its initialization. For that the loader that loaded the current code is used, making the loading of all classes, even built-in ones, lazy.
A class can be manually loaded from a specific loader by passing the binary name of the class as an argument to the
loadClass
mehtod.In URLClassLoader and standard JVM loaders, the source of the class is a .class file. Other loaders in their implementations use different sources: this could be a network resource, or a class could be generated at runtime. For example, a loader from javassist specializes in creating classes on the fly.
As a result of loading, an instance of the Class class is created. Unlike regular objects, such instances are not stored in the heap but in permgen/metaspace. A
Class
might be unloaded when the ClassLoader
that loaded it becomes eligible for garbage collection.