理解Class.forName()

对于大部分人来说,第一次见到class.forName(String className)这句代码应该是在使用jdbc方式连接数据库的时候。


Class类概念

Class也是一个Java类,保存的是与之对应Java类的meta信息(元信息),用来描述这个类的结构,比如描述一个类有哪些成员,有哪些方法等。一般在反射中使用。

详细解释:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例(Class对象)。也就是说,在Java中,每个java类都有一个相应的Class对象,用于表示这个java类的类型信息。

类加载概念

当使用一个类的时候(比如new一个类的实例),会检查此类是否被加载到内存,如果没有,则会执行加载操作。

读取类对应的class文件数据,解析此数据,构造一个此类对应的Class类的实例。此时JVM就可以使用该类了,比如实例化此类,或者调用此类的静态方法。

Java也提供了手动加载类的接口,class.forName()方法就是其中之一。

(说来说去,其实就是生成这个类的Class)

类加载器的概念

顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance()方法就可以创建出该类的一个对象。
基本上所有的类加载器都是 java.lang.ClassLoader类的一个实例。

类初始化概念

类被加载之后,jvm已经获得了一个描述类结构的Class实例。但是还需要进行类初始化操作之后才能正常使用此类,类初始化操作就是执行一遍类的静态语句,包括静态变量的声明还有静态代码块。


Class.forName()方法

此方法含义是:加载参数指定的类,并且初始化它。


在jdbc连接数据库中的应用

到这里,不用解释,读者也会明白,在使用jdbc方式连接数据库时,为什么要执行Class.forName('驱动类名')方法了:将驱动类的class文件装载到内存中,并且形成一个描述此驱动类结构的Class类实例,并且初始化此驱动类,这样jvm就可以使用它了,这就是Class.forName()方法的含义。

有数据库开发经验朋友会发现,为什么在我们加载数据库驱动包的时候有的却没有调用newInstance( )方法呢?即有的jdbc连接数据库的写法里是Class.forName(xxx.xx.xx);而有一 些:Class.forName(xxx.xx.xx).newInstance(),为什么会有这两种写法呢? 
刚才提到,Class.forName("");的作用是要求JVM查找并加载指定的类,如果在类中有静态初始化器的话,JVM必然会执行该类的静态代码 段。而在JDBC规范中明确要求这个Driver类必须向DriverManager注册自己,即任何一个JDBC Driver的 Driver类的代码都必须类似如下: 

  public class MyJDBCDriver implements Driver {    

static
     DriverManager.registerDriver(new MyJDBCDriver());  

 } 

  } 
既然在静态初始化器的中已经进行了注册,所以我们在使用JDBC时只需要Class.forName(XXX.XXX);就可以了。

  • 17
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
1) 实现checkUserExistDao类中checkIsExist(String tel, String code)方法的代码: ``` public boolean checkIsExist(String tel, String code) { Connection conn = null; PreparedStatement pstm = null; ResultSet rs = null; boolean exist = false; try { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/20JK?useSSL=false&serverTimezone=UTC"; conn = DriverManager.getConnection(url, "root", "123"); String sql = "SELECT * FROM User WHERE tel=? AND code=?"; pstm = conn.prepareStatement(sql); pstm.setString(1, tel); pstm.setString(2, code); rs = pstm.executeQuery(); if (rs.next()) { exist = true; } } catch (Exception e) { e.printStackTrace(); } finally { try { if (rs != null) { rs.close(); } if (pstm != null) { pstm.close(); } if (conn != null) { conn.close(); } } catch (Exception e) { e.printStackTrace(); } } return exist; } ``` 2) Statement和PreparedStatement对象的异同: Statement对象是用于执行静态SQL语句的,每次执行SQL语句都需要编译一次,效率较低。PreparedStatement对象是用于执行动态SQL语句的,可以预编译SQL语句,提高了执行效率。PreparedStatement对象可以防止SQL注入攻击,也更加安全。 3) MVC开发模式是指将应用程序划分为三个部分:模型(Model)、视图(View)和控制器(Controller)。模型表示应用程序中处理数据和业务逻辑的部分,视图表示应用程序中处理数据显示的部分,控制器是模型和视图之间的桥梁,负责处理用户的输入和调用模型来处理用户请求。MVC开发模式可以将应用程序分离为不同的组件,降低了应用程序的耦合度,提高了程序的可维护性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值