Get the class through the fully qualified name of the class (package name and class name) .class
file, loaded into metaspace.
Verification:Check the security of the .class
file
Preparation:Allocate memory for static type variables and set default values
Parsing:Convert symbol references in the constant pool to direct references , the symbol reference points to an unloaded class, or a field or method of an unloaded class, then the parsing will trigger the loading of this class
Execution class The constructor method init
() process, if the class has a parent class, jvm
will ensure that the init
of the parent class is executed first, and then the subclass is executed. The init
.
Start class loader is implemented by C/C language, using to load the Java core class library. The startup class only loads classes whose package names begin with: java, javax, and sun
The parent class loader is Startup class loader
. Load class libraries in the following two directories:
java.ext.dirs
Directory
JDK installation directory: jre/lib/ext
Directory
We can put our own packages in the above directory and they will be automatically loaded. .
The parent class loader is Start class loader
, which is responsible for loading environment variable classpath
or system property java .class.path
The class library under the specified path is the default class loader in the program. All classes in our Java program are loaded by it.
Inherit the java.lang.ClassLoader
class and override the findClass() method. If there are no too complex requirements, you can directly inherit the URLClassLoader
class and override the loadClass
method.
Function
Encryption: Java code can be easily decompiled, if you need to decompile your own code To encrypt to prevent decompilation, you can first encrypt the compiled code with a certain encryption algorithm. After the class is encrypted, you can no longer use Java's ClassLoader to load the class. In this case, you need to customize the ClassLoader to decrypt the class first when loading the class. , and then load again.
Load code from non-standard sources: If your bytecode is placed in a database or even in the cloud, you can customize the class loader to load classes from specified sources .
jvm uses an on-demand loading method for class files. When the class needs to be used, jvm will load its class file. Generate class objects in memory. When loading a class, the Parental delegation mechanism
is used.
If a class loader
receives a class loading
request, it will not load it first, but will delegate the request to Parent class loader
to execute.
If the parent class still has a parent class loader, continue to delegate upward until Start the class loader: Bootstrap ClassLoader
If the parent class loader can complete the loading task, it will return a successful result. If the parent class fails to load, the subclass will try to load it by itself. If the subclass fails to load, it will throw ClassNotFoundException
Exception, this isParental delegation model
Breaking the parent delegation model
Usage:
There are many service provider interfaces (Service Provider Interface, SPI) in Java applications. These interfaces allow third parties to provide implementations for them. For example, common SPIs include JDBC, JNDI, etc. These SPI interfaces belong to the Java core library, generally exist in the rt.jar package, and are loaded by the Bootstrap class loader. The Bootstrap class loader cannot directly load the SPI implementation class, so it needs to be delegated to other class loaders for loading.
In the Tomcat server, there is a server running multiple different versions. However, due to the demand for services with the same name, it is necessary to break the parent delegation model and load multiple classes with the same name.
Method:
Use context class loader
Reuse Write loadClass
method
The above is the detailed content of Overview of Java class loaders and class loading process. For more information, please follow other related articles on the PHP Chinese website!