0x01 功能
Class.forName("xxxx")
的功能: 除了将类的.class
文件加载到jvm
中之外,还会对类进行解释,执行类中的static
块
注意: Class.forName(name, initialize, loader)
第二个参数设置为false
可控制不加载static
块
0x02 例子
0x02.1 环境搭建
// 使用例子
# 目录结构
├── src
│ └── main
│ └── java
│ └── Test
│ ├── Foo.java
│ ├── Test1.java
│ └── Test2.java
// 文件名: Foo.java
package Test;
public class Foo {
static {
System.out.println("static被执行了");
}
}
0x02.2 例子一
// 文件名: Test1.java
package Test1;
public class Test1 {
public static void main(String[] args) {
try {
Class.forName("Test.Foo");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
// 执行结果
// static被执行了
0x02.3 例子二
// 文件名: Test2.java
package Test;
public class Test2 {
public static void main(String[] args) {
try {
Class.forName("Test.Foo", false, Test.Foo.class.getClassLoader());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
// 执行结果
// 啥也没有,因为第二个参数为false了,表示不加载static块