kingslave1
breezefaith
采纳率66.7%
2017-06-14 09:17 浏览 2.6k

jdbc为什么要用反射机制?

1

代码如下

 try{
Class.forName("com.mysql.jdbc.Driver");
Connection c=DriverManager.getConnection(url);
}catch(Exception e){
System.err.println("no class!");
}

在这里注册mysql数据库驱动,为什么要用到反射机制?不用反射机制直接import指定的类不行吗?注意重点是为什么

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

7条回答 默认 最新

  • 已采纳
    qq_27718453 庄粟 2017-06-15 03:34

    因为反射好用,
    为什么好用呢,因为你给个类地址它就能new 一个对象出来,动态的
    最重要的是地址是字符串,是一个变量,不是一个具体对象,也就是说它脱离了代码,增加了相当大的灵活性。这里的灵性性是对对象的处理。

    个人理解,当你用久了面向对象编程,对一条条规定用烦的时候,你会觉得反射这个机制相当于打破了这些规定,什么对象方法,想怎么弄就怎么弄,想怎么改就怎么改。
    反正好用,不过性能上不太好,所以用的都是关键的地方

    点赞 评论 复制链接分享
  • weixin_35761153 weixin_35761153 2017-06-14 10:04

    你可以看看什么叫工厂模式,反射的作用就是,无论你使用哪种数据库(数据库类型)只需要把数据库的驱动名称传过来就能穿件对象,而制定类只能创建你制定的数据库对象。

    点赞 1 评论 复制链接分享
  • qq_38494537 chenjiexixi 2017-06-14 09:22

    import方式也可以,但明显你觉得那个更方便简洁?

    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.Driver;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.util.Properties;

    public class Main {

    public void TestJDBC(){

    //将配置文件变成输入流
    InputStream in =
    getClass().getClassLoader().getResourceAsStream("jdbc.properties");
    Properties properties = new Properties();
    try {
    //从流中获取配置信息到Properties对象
    properties.load(in);
    //读取配置文件
    String driverClass = properties.getProperty("driver");
    String jdbcUrl = properties.getProperty("jdbcUrl");
    String user = properties.getProperty("user");
    String password = properties.getProperty("password");

    //注册驱动
    Driver driver = (Driver)Class.forName(driverClass).newInstance();

    Connection conn = DriverManager.getConnection(jdbcUrl,user,password);
    System.out.println(conn);

    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (InstantiationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    }
    public static void main(String[] args) {
    Main m = new Main();
    m.TestJDBC2();

    }

    }

    点赞 评论 复制链接分享
  • tangyongzhe Nostalgia_forever 2017-06-14 15:32

    首先你要知道com.mysql.jdbc.Driver的作用是什么,加载这个类实际是注册了对应的jdbc driver,不同的数据库厂商driver是不同的简单理解是类名不同,写死在代码里面不灵活,所以提取出来到配置文件里了。

    点赞 评论 复制链接分享
  • dhcao1112 TuringK 2017-06-14 16:02

    嗯,,建议百度一下反射和工厂模式。

    点赞 评论 复制链接分享
  • qzcsu 小书go 2017-06-15 01:59

    如果不用反射 你的 驱动注册要写死 是用 MySQL 还是 sqlsever 这样扩展性不好

    点赞 评论 复制链接分享
  • qq_26708427 沈泽文 2017-06-15 03:29

    一般项目里都会有数据库配置文件,其中就有一条是driverName="com.mysql.jdbc.Driver",代码会根据配置文件加载驱动。
    当你想换数据库时只要修改driverName的值就可以了,代码就不需要修改
    你在代码里直接new 个mysql的Driver,那换数据库时不是还要修改代码中你new 的Driver

    点赞 评论 复制链接分享

相关推荐