1700447861
意义在于:加载一个类即表示要初始化该类的static变量,特别是static代码块,在这里我们可以做大量的工作,比如注册自己,初始化环境等,这才是我们要重点关注的逻辑,例如如下代码:
1700447862
1700447863
class Utils{
1700447864
1700447865
//静态代码块
1700447866
1700447867
static{
1700447868
1700447869
System.out.println(“Do Something”);
1700447870
1700447871
}
1700447872
1700447873
}
1700447874
1700447875
public class Client{
1700447876
1700447877
public static void main(String[]args)throws Exception{
1700447878
1700447879
//动态加载
1700447880
1700447881
Class.forName(“Utils”);
1700447882
1700447883
}
1700447884
1700447885
}
1700447886
1700447887
注意看Client类,我们并没有对Utils做任何初始化,只是通过forName方法加载了Utils类,但是却产生了一个“Do Something”的输出,这就是因为Utils类被加载后,JVM会自动初始化其static变量和static代码块,这是类加载机制所决定的。
1700447888
1700447889
对于此种动态加载,最经典的应用就是数据库驱动程序的加载片段,代码如下:
1700447890
1700447891
//加载驱动
1700447892
1700447893
Class.forName(“com.mysql.jdbc.Driver”);
1700447894
1700447895
String url=“jdbc:mysql://localhost:3306/db?user=&password=”;
1700447896
1700447897
Connection conn=DriverManager.getConnection(url);
1700447898
1700447899
Statement stmt=conn.createStatement();
1700447900
1700447901
……
1700447902
1700447903
在没有Hibernate和Ibatis等ORM框架的情况下,基本上每个系统都会有这么一个JDBC连接类,然后提供诸如Query、Delete等的方法,大家有没有想过为什么要加上forName这句话呢?没有任何的输出呀,要它干什么用呢?事实上非常有用,我们看一下Driver类的源码:
1700447904
1700447905
public class Driver extends NonRegisteringDriver implements java.sql.Driver{
1700447906
1700447907
//静态代码块
1700447908
1700447909
static{
1700447910
[
上一页 ]
[ :1.700447861e+09 ]
[
下一页 ]