1700447924
1700447925
//构造函数
1700447926
1700447927
public Driver()throws SQLException{
1700447928
1700447929
}
1700447930
1700447931
}
1700447932
1700447933
该程序的逻辑是这样的:数据库的驱动程序已经由NonRegisteringDriver实现了,Driver类只是负责把自己注册到DriverManager中。当程序动态加载该驱动时,也就是执行到Class.forName(“com.mysql.jdbc.Driver”)时,Driver类会被加载到内存中,于是static代码块开始执行,也就是把自己注册到DriverManager中。
1700447934
1700447935
需要说明的是,forName只是把一个类加载到内存中,并不保证由此产生一个实例对象,也不会执行任何方法,之所以会初始化static代码,那是由类加载机制所决定的,而不是forName方法决定的。也就是说,如果没有static属性或static代码块,forName就只是加载类,没有任何的执行行为。
1700447936
1700447937
注意 forName只是加载类,并不执行任何代码。
1700447938
1700447939
1700447940
1700447941
1700447943
编写高质量代码:改善Java程序的151个建议 建议105:动态加载不适合数组
1700447944
1700447945
上一个建议解释了为什么要使用forName,本建议就来说说哪些地方不适合使用动态加载。如果forName要加载一个类,那它首先必须是一个类—8个基本类型排除在外,它们不是一个具体的类;其次,它必须具有可追索的类路径,否则就会报ClassNotFoundException。
1700447946
1700447947
在Java中,数组是一个非常特殊的类,虽然它是一个类,但没有定义类路径,例如这样的代码:
1700447948
1700447949
public static void main(String[]args)throws Exception{
1700447950
1700447951
String[]strs=new String[10];
1700447952
1700447953
Class.forName(“java.lang.String[]”);
1700447954
1700447955
}
1700447956
1700447957
String[]是一个类型声明,它作为forName的参数应该也是可行的吧!但是非常遗憾,其运行结果如下:
1700447958
1700447959
Exception in thread”main”java.lang.ClassNotFoundException:java/lang/String[]
1700447960
1700447961
at java.lang.Class.forName0(Native Method)
1700447962
1700447963
at java.lang.Class.forName(Class.java:169)
1700447964
1700447965
at Client.main(Client.java:6)
1700447966
1700447967
产生ClassNotFoundException异常的原因是数组虽然是一个类,在声明时可以定义为String[],但编译器编译后会为不同的数组类型生成不同的类,具体如表7-2所示。
1700447968
1700447969
1700447970
1700447971
1700447972
在编码期,我们可以声明一个变量为String[],但是经过编译器编译后就成为了[Ljava.lang.String。明白了这一点,再根据以上的表格可知,动态加载一个对象数组只要加载编译后的数组对象就可以了,代码如下:
1700447973
[
上一页 ]
[ :1.700447924e+09 ]
[
下一页 ]