0x01 功能

Class.forName("xxxx")的功能: 除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static

注意: Class.forName(name, initialize, loader)第二个参数设置为false可控制不加载static

0x02 例子

0x02.1 环境搭建

  1. // 使用例子
  2. # 目录结构
  3. ├── src
  4. └── main
  5. └── java
  6. └── Test
  7. ├── Foo.java
  8. ├── Test1.java
  9. └── Test2.java
  1. // 文件名: Foo.java
  2. package Test;
  3. public class Foo {
  4. static {
  5. System.out.println("static被执行了");
  6. }
  7. }

0x02.2 例子一

  1. // 文件名: Test1.java
  2. package Test1;
  3. public class Test1 {
  4. public static void main(String[] args) {
  5. try {
  6. Class.forName("Test.Foo");
  7. } catch (ClassNotFoundException e) {
  8. e.printStackTrace();
  9. }
  10. }
  11. }
  12. // 执行结果
  13. // static被执行了

0x02.3 例子二

  1. // 文件名: Test2.java
  2. package Test;
  3. public class Test2 {
  4. public static void main(String[] args) {
  5. try {
  6. Class.forName("Test.Foo", false, Test.Foo.class.getClassLoader());
  7. } catch (ClassNotFoundException e) {
  8. e.printStackTrace();
  9. }
  10. }
  11. }
  12. // 执行结果
  13. // 啥也没有,因为第二个参数为false了,表示不加载static块