下图为整个项目的结构构图
一、Connection接口
sun公司提供Connection接口,代码如下
package bridge;
/**
* Sun提供
*/
public interface Connection
{
public void f1();
}
二、各厂商实现Connection接口
package bridge;
public class ConnectionOracle implements Connection
{
public void f1()
{
System.out.println("Oracle Connec6tion");
}
}
三、Sun公司提供DriverManager类
package bridge;
public class DriverManager
{
private static Connection conn=null;
public static Connection getConnection()
{
return conn;
}
public static void setConnection(Connection con)
{
conn=con;
}
}
四、各厂商编写驱动
package bridge;
public class OracleDriver
{
static
{
DriverManager.setConnection(new ConnectionOracle());
}
}
五、程序调用
package bridge;
public class App {
public static void main(String[] args) throws ClassNotFoundException
{
//Class.forName(xxx.xx.xx)作用是要求JVM查找并加载指定的类
//即,调用厂商编写的驱动OracleDriver(详见四)
//OracleDrivaer里的static块以及static变量会自动
Class.forName("bridge.OracleDriver");
Connection conn=DriverManager.getConnection();
conn.f1();
}
}
Class.forName()用法详解
Class.forName(xxx.xx.xx)返回的是一个类。
Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段。
Class.forName( )静态方法的目的是为了动态加载类。
Class.forName("")返回的是类
Class.forName("").newInstance()返回的是object
通常编码过程中,在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作。 因此,单使用Class.forName( )是动态加载类是没有用的,其最终目的是为了实例化对象。
相关英文参考文献如下:
we just want to load the driver to jvm only, but not need to user the instance of driver,
so call Class.forName(xxx.xx.xx) is enough, if you call Class.forName(xxx.xx.xx).newInstance(),
the result will same as calling Class.forName(xxx.xx.xx),
because Class.forName(xxx.xx.xx).newInstance() will load driver first,
and then create instance, but the instacne you will never use in usual,
so you need not to create it.
为什么没有调用Class下的newInstance( )静态方法来实例化对象以便操作?
Class.forName(xxx.xx.xx)的一个作用会执行该类的静态代码段(详见四)
既然在静态初始化器的中已经进行了注册,所以我们在使用JDBC时只需要Class.forName(XXX.XXX);就可以了。
new 和Class.forName()有什么区别?
- A a = (A)Class.forName(“pacage.A”).newInstance();
这和 A a = new A(); 是一样的效果。 - newInstance( )是一个方法,而new是一个关键字;