This article mainly introduces you to the relevant information about java's implementation of silent loading of Class. The article introduces it in great detail through sample code. It has certain reference learning value for everyone to learn or use java. Friends who need it will follow below. Let’s learn together.
Preface
This article mainly introduces the relevant content about java silently loading Class. The reason for this article is because sometimes During development, we have a scenario where we only want to get the basic information of a Class, but do not want to trigger the relevant static code blocks. This method was used in a previous "JAVA Scanning Package" article. I will It's called silent loading. If you have a professional name for it, please correct me.
Generally, when we load a Class, we will use the Class.forName(String name)
method, which will return a Class object and trigger the Static code block, for example:
Let's first write a Bean class that only contains static code blocks.
package com.jinggujin.classloader; public class Bean { static { System.err.println("static code block."); } }
Using the err stream is to output information in time. Using out will cause caching, which may cause the output information to be out of sequence.
Then write Test method to test.
package test; import org.junit.Test; public class ClassLoaderTest { @Test public void test() throws Exception { Class.forName("com.jinggujin.classloader.Bean"); } }
Run and observe the console output:
static code block.
At this time the console will output that we are in static The content printed in the code block proves that using Class.forName(String name)
will trigger the static code block. Then, to achieve silent loading, we cannot use this method. We You can use the loadClass(String name)
method of ClassLoader to load. This method will only load the class without triggering the static code block. Write the same test method for testing.
package test; import org.junit.Test; public class ClassLoaderTest { @Test public void test() throws Exception { Class<?> clazz = Thread.currentThread().getContextClassLoader().loadClass("com.jinggujin.classloader.Bean"); System.err.println(clazz.getName()); } }
Run and observe the console output:
com.jinggujin.classloader.Bean
We found that only the class name information we printed was output in the console, while the static The code block is not executed. In addition, we can actually use the overridden method Class.forName(String name)
forName(String name, boolean initialize, ClassLoader loader)
, The effect of silent loading can also be achieved.
Summarize
The above is the detailed content of Java silently loads sample code for Class implementation. For more information, please follow other related articles on the PHP Chinese website!