日期:2014-05-20  浏览次数:20704 次

普通类和jar包问题?
jar包跟普通java类用法不一样吗? 我在WEB工程里面那些jar包都是怎么工作的? 
比如我连接oracle数据库时工程目录下已经把驱动包都拷到我的当前工程WEB-INF/lib下了,那为什么还要再次Class.forName(---)去加载驱动呢? 
jar包已经在我的当前工程下了,难道它里面的方法不能直接用吗?

------解决方案--------------------
java中的类分三种,基础类,扩展类,编码人员自定义类,jar包属于第二或第三种,当楼主显式调用jar包中的类或方法时需要import引入,并且该类被编译器编译后会自动加载这个jar包中所用到的类。
当前情况是楼主使用了jdbc的操作数据库服务接口来获取对数据库的操作服务,依赖于这个规范而非具体实现,而jdbc背后的实现也没有把针对不同数据库的部分写死在里面,而是需要调用端手动加载映射(Class.forName())。

------解决方案--------------------
jar虽然被导入了,但类不一定被加载,类只有在被用到的时候才加载
你的程序里并不直接import你的驱动类,因为一般驱动类的具体类名是什么不需要也没必要关心,不同的提供商类名可能不一样,但是不管怎样该类一定是Sun的sql包下的接口类的实现。所以一般数据库程序里不直接import该驱动类而是import sun的sql包的类(当然有些框架是自己封装了这些类)。此时你要用到具体的驱动类,但你没有import,所以你只能用反射的class.forName去找到并加载这个类