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

解决方案 »

  1.   

    确实不能直接使用的
     
    都需要调用的 普通法的java类 比如 Date 也是需要调用的啊
      

  2.   

    这个以前看到过解释,没有仔细研究过,跟java的类装载器的安全性有关
      

  3.   

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

  4.   

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

  5.   

    class.forName()方法将类加载到内存了
      

  6.   

        谢谢大家了,三楼和四楼讲的都挺详细的!
    那我想用jar包里面的方法时是要在import后只加jar包名还是必须再加上jar包里面的类名呀?
      

  7.   

    方法是存在类里面的,不可能独立,所以你可以import包下的.*
    (你要用解压工具查看jar里的包)
      

  8.   

        楼上,真的很谢谢你,我基本上明白了
    只是还有点校疑问:就是我可以import class12.*;这样导入如oracle驱动吗?就是不用Class.forName();
    我感觉工程里面用的好多jar包,比如jstl的jar包还有别的jar包,都没有反向加载,为什么数据库就要必须这样做呢?