打字猴:1.700447898e+09
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
1700447911 try{
1700447912
1700447913 //把自己注册到DriverManager中
1700447914
1700447915 java.sql.DriverManager.registerDriver(new Driver());
1700447916
1700447917 }catch(SQLException E){
1700447918
1700447919 //异常处理
1700447920
1700447921 }
1700447922
1700447923 }
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
1700447942 编写高质量代码:改善Java程序的151个建议 [:1700438178]
1700447943 编写高质量代码:改善Java程序的151个建议 建议105:动态加载不适合数组
1700447944
1700447945 上一个建议解释了为什么要使用forName,本建议就来说说哪些地方不适合使用动态加载。如果forName要加载一个类,那它首先必须是一个类—8个基本类型排除在外,它们不是一个具体的类;其次,它必须具有可追索的类路径,否则就会报ClassNotFoundException。
1700447946
1700447947 在Java中,数组是一个非常特殊的类,虽然它是一个类,但没有定义类路径,例如这样的代码:
[ 上一页 ]  [ :1.700447898e+09 ]  [ 下一页 ]